本文共 1496 字,大约阅读时间需要 4 分钟。
本人学习笔记,代码参考如下网址
参考http://www.cnblogs.com/dma1982/archive/2012/02/08/2342215.html
zhangbh@prolin-srv:<~$> gcc -rdynamic -o my a.czhangbh@prolin-srv:<~$> ./my backtrace() returned 5 addresses ./my(my_func+0x1f)[0x40089c]./my(run+0x9)[0x4008e0]./my(main+0x14)[0x4008f6]/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f68032c7ec5]./my[0x4007b9]
Linux中共提供了三个函数用于打印调用堆栈:/** 函数说明: 取得当前函数的调用堆栈* 参数:* buffer:用于存储函数地址的数组* size:buffer数组的长度* 返回值:* 存储到数组中的函数个数*/int backtrace(void **buffer, int size); /*** 函数说明:将一组函数地址转换为字符串* 参数:* buffer: 经由backtrace得到的函数地址* size: buffer数组的长度* 返回值:* 函数在系统中对应用字符串*/char **backtrace_symbols(void *const *buffer, int size); /** 函数说明:将一组函数地址转换为字符串* 参数:* buffer: 经由backtrace得到的函数地址* size: buffer数组的长度* fd: 输出结果文件描述符*/void backtrace_symbols_fd(void *const *buffer, int size, int fd);
#include#include #include #include void my_func(void){ int j, nptrs;#define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses \r\n", nptrs); backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO);}void run(void){ my_func();}int main(int argc, char **argv){ run(); return 0;}