|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。( E5 ]% n+ M' }
在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。& ] v: _: ^ O0 F: k H
7 z( Y" g3 w- g9 U3 t9 X
int backtrace(void **buffer,int size) & a U3 E( a% N1 K8 a
z$ v* \* F1 S! A该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小
. a$ Y9 }" y5 R% }# [4 b8 V5 F6 O7 e7 L9 K" F9 }5 K9 _
在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址
- C, Q, w- a. K/ I% I2 x: P* X6 [& A m: J
注意:某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会导致无法正确解析堆栈内容
6 \; g9 D& ]8 {& F8 ychar ** backtrace_symbols (void *const *buffer, int size) + k( w) c+ o' Z5 M& Q
+ y! y. T" C8 |7 C# L7 ibacktrace_symbols将从backtrace函数获取的信息转化为一个字符串数组. 参数buffer应该是从backtrace函数获取的指针数组,size是该数组中的元素个数(backtrace的返回值)0 B/ {, ]0 M! I3 I2 K4 l0 W
) ?: D( v' T) Z5 o$ |- j1 T0 O, W: ?函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名,函数的偏移地址,和实际的返回地址
' d6 D9 m* _1 h
% j A, w1 c4 X( V* w q4 g/ g7 y6 r5 y
|
|