衍艺网站建设,汽车租赁网站建设,wordpress添加页头代码,站长工具果冻传媒glibc提供了backtrace这个库函数#xff0c;可以用来打印call stack。比如我们可以在程序中注册常见的一些signal#xff0c;比如SIGSEGMENT, SIGPIPE#xff0c;然后在这些信号的回调函数中#xff0c;利用backtrace打印出call stack#xff0c;这样debug就非常的方便。 …glibc提供了backtrace这个库函数可以用来打印call stack。比如我们可以在程序中注册常见的一些signal比如SIGSEGMENT, SIGPIPE然后在这些信号的回调函数中利用backtrace打印出call stack这样debug就非常的方便。 backtrace的使用很简单使用man手册中的Example代码即可例如 1 #include execinfo.h 2 #include stdio.h3 #include string.h4 #include stdlib.h5 #include errno.h6 7 #define SIZE 1008 9 void dump_stack()
10 {
11 int btnum 0;
12 void *btbuf[SIZE];
13 char **btstrings NULL;
14 int i;
15
16 /* Get backtrace */
17 btnum backtrace(btbuf, SIZE);
18 btstrings backtrace_symbols(btbuf, btnum);
19 if (btstrings NULL) {
20 printf(Backtrace failed: %d:%s\n, errno, strerror(errno));
21 } else {
22 printf(Backtraces, total %d items\n, btnum);
23 for (i 0; i btnum; i)
24 printf(%s\n, btstrings[i]);
25
26 free(btstrings);
27 }
28 }
29
30 void start_working()
31 {
32 printf(Start working...\n);
33 dump_stack();
34 }
35
36 int main()
37 {
38 printf(Start backtracing...\n);
39 start_working();
40 return 0;
41 } 首先用backtrace最多生成100层的call stack。然后用backtrace_symbols将backtrace返回的一堆地址翻译成函数名称。backtrace的返回值是具体生成了多少层的call stack填充的btbuf是一个void *的数组里面每个element都是一个void *其实就是一个地址。 backtrace_symbols生成的字符串都是malloc出来的但是不要最后一个一个的free因为backtrace_symbols是根据backtrace给出的call stack层数一次性的malloc出来一块内存来存放结果字符串的所以像上面代码一样只需要在最后free backtrace_symbols的返回指针就OK了。这一点backtrace的manual中也是特别提到的。 此外需要注意的是使用backtrace来获取调用栈信息在编译的时候需要加入-rdynamic这个option是传递给linker的linker会将symbol放到.dydym table中这样backtrace_symbols才能获取到地址对应的symbol。所以即使是使用了-g来编译程序如果不使用-rdynamic的话backtrace_symbols也找不到地址对应的symbol。这是backtrace系列函数的一个缺陷。不过有了地址也算是一个很大帮助了毕竟可以使用gdb来找到对应的symbol。 转载于:https://www.cnblogs.com/super119/archive/2010/12/09/1901468.html