如下函数可以在任意函数中打印出当前的调用堆栈
输出到标准输出设备,一般就是命令行了
需要注意的是必须包含下面的标准库头文件,因为man backtrace,它的声明就在这个头文件中
#include<execinfo.h>
下面简单介绍一下工作原理
主要基本2个调用来实现的:
首先是命令行的addr2line。他可以把一个可执行文件中的函数地址转换为源代码的位置以及当前函数名
要实现这个还有个前提,必须编译调试版本,应此在Makefile里面CFLAGS必须有-rdynamic -g 编译选项
其次,调用backtrace 获得当前函数的指针
最后通过popen打开一个标准输出的文件句柄,把addr2line 带上正确的参数发送过去,标准输出会等待继续函数地址,就会连续的打印函数地址对应的源代码信息
在backtrace获得一个函数地址数组以后,循环执行fprintf向标准输出写入这些函数地址,注意,每个指针后面要跟上\r\n作为结束符才能正确执行,否则看不到正确的输出
下面是完整的代码:
void print_trace(void)
{int i;
int MAX_CALLSTACK_DEPTH = 32;
void *traceback[MAX_CALLSTACK_DEPTH];
char cmd[512] = "addr2line -f -e ";
char *prog = cmd + strlen(cmd); <