C++中backtrace打印函数调用栈callstack-dbg_assert

1. 使用backtrace()函数获取调用栈,是一个指针数组,返回获取到的调用栈个数,结果放到传入的指针数组里面;
2. 调用backtrace_symbols()把获取的指针数组和数组中调用栈个数传递给该函数,会返回一个新的指针数组,
   里面是已经转换成符号表的调用栈信息;用完后记得需要free返回的指针变量指向的内存空间;
使用这两个函数需要包含execinfo.h头文件;

下面把这个过程封装成了一个宏函数方便以后使用;

#ifndef __DEBUG_HPP__
#define __DEBUG_HPP__
#include <iostream>
#include <execinfo.h>

/* include <execinfo.h> to use this macro */
#define DBG_ASSERT(x) do { \
    if (x) { break; } \
    std::cout << "\r\n------ " <<  __FILE__ << " " <<  __LINE__ << " ------" << endl;\
    void *pptrace_raw[32] = {0}; \
    char **pptrace_str = NULL; \
    int  trace_num = 0, i = 0; \
    trace_num = backtrace(pptrace_raw, 32); \
    pptrace_str = (char **)backtrace_symbols(pptrace_raw, trace_num); \
    for (i = 0; i < trace_num; i++) { std::cout << pptrace_str[i] << endl; } \
    if (pptrace_str) { delete pptrace_str; } \
} while (0);

#endif

猜你喜欢

转载自blog.csdn.net/halazi100/article/details/84037452