过编程方式获取backtrace(函数调用栈)
在用GDB调试器时可以查看所谓的Backtrace,它包含一系列的函数调用信息,用命令backtrace或bt可以在GDB中查看函数调用栈的信 息。有些场合没法使用GDB时,则可以用glibc库函数中的一些相关函数来得到backtrace的信息(在头文件execinfo.h中): // 获取将backstrace信息,将地址存到buffer中。
// 参数size指定buffer的最大值,返回值则是backstrace的实际大小
int backtrace (void **buffer, int size)
// 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小
char ** backtrace_symbols (void *const *buffer, int size)
// 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息,
// 而是将结果写到文件描述符fd所代表的文件中
void backtrace_symbols_fd (void *const *buffer, int size, int fd)
使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
1 #include <execinfo.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 /* Obtain a backtrace and print it to stdout. */
6 void print_trace (void)
7 {
8 void *array[10];
9 size_t size;
10 char **strings;
11 size_t i;
12
13 size = backtrace (array, 10);
14 strings = backtrace_symbols (array, size);
15
16 printf ("Obtained %zd stack frames.\n", size);
17
18 for (i = 0; i < size; i++)
19 printf ("%s\n", strings[i]);
20
21 free (strings);
22 }
23
24 /* A dummy function to make the backtrace more interesting. */
25 void dummy_function (void)
26 {
27 print_trace ();
28 }
29
30 int main (void)
31 {
32 dummy_function ();
33 return 0;
34 }
编译运行的结果如下: # gcc bt.c -rdynamic -o bt
# ./bt
Obtained 5 stack frames.
./bt(print_trace+0x14) [0x80486e4]
./bt(dummy_function+0xb) [0x8048765]
./bt(main+0x15) [0x804877c]
/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]
./bt(backtrace_symbols+0x31) [0x8048641]
你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析
分享到:
相关推荐
arm异常定位方法 包括 1.arm 中断、异常处理流程 2.arm异常时保存的寄存器 3.aapcs 用来分析如何进行backtrace 4.常见工具推荐
也可以在正常状态下使用该库,获取当前的函数调用栈;支持 裸机 及以下操作系统平台:(RT-Thread,UCOS,FreeRTOS需修改源码);根据错误现场状态,输出对应的 线程栈 或 C 主栈;故障诊断信息支持多国语言(目前:...
在正常情况下,也可以使用该库来获取当前函数调用堆栈; 支持裸机和以下操作系统平台: RT线程 UCOS公司 FreeRTOS(源代码需要修改) 根据错误场景状态,输出对应的线程栈或C主栈; 故障诊断信息支持多种语言(目前为...
事情的起因是这样的,之前同事的代码有一个内存池出现了没有回收的情况。也是是Pop出来的对象没有Push回去,情况很难复现... 主要是通过backtrace返回调用的栈帧,然后通过backtrace_symbols把地址转换为字符串。后,
输出错误现场的函数调用栈(需要配合addr2line工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置,逻辑更快捷,精确。调用栈; 支持裸机及以下操作系统平台: 优科斯 FreeRTOS(需修改源码) 根据...
有时候我们想知道这个函数或方法的调用堆栈,也就是它是如何一级一级是被调用到的,可以用 PHP 的 debug_backtrace 函数打印,就像这样: 示例代码 public function update(Request $request, $id) { dd(debug_...
本文实例讲述了php中debug_backtrace、debug_print_backtrace和匿名函数用法。分享给大家供大家参考。具体分析如下: ...一、debug_backtrace 它可以回溯跟踪函数的调用信息,可以说是一个调试利器,代码如下:
linux内核堆栈打印方法 dump_stack() 或 __backtrace() linux应用层堆栈打印...把backtrace获取的栈信息转化为字符串,以字符指针数组的形式返回,参数size限定转换的深度,一般用backtrace调用的返回值。 void bac
主要介绍了PHP使用debug_backtrace方法跟踪调试代码调用,结合实例形式详细分析了debug_backtrace函数的功能、参数、使用方法及相关操作注意事项,需要的朋友可以参考下
在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入: dump_stack(); 或 __backtrace(); 即可 dump_stack()在~/kernel/ lib/Dump_stack.c中定义 void dump_stack(void)...
如何使用 backtrace 函数追踪函数调用链,并且定位出错的地方以及出错原因。
解析backtrace符号
要在PHP中获取回溯,可以使用debug_backtrace函数。 默认情况下,可能很难使用。 所报告的框架功能名称有偏斜:它属于前一框架。 同样,需要使用位掩码来传递选项。 与debug_backtrace相比,此包提供了一种更好的...
通过捕捉signal来打印对应的backtrace,需要注意的是执行档和所有lib必须添加-rdynamic -funwind-tables -ffunction-sections参数编译
How to use a backtrace to follow the execution path and find out what went wrong and where. 如何使用backtrace函数追踪函数调用链,并且定位出错的地方以及出错原因。
当nginx收到异常信号SIGINT退出时,会将此时的函数调用堆栈输出到日志文件中,方便调试。