|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。
t2 \% R+ V' K [在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。
6 P8 l. Z' D9 C3 b2 n8 f& x) z( w$ r$ C9 P5 ?, b4 X
int backtrace(void **buffer,int size)
J! c2 ?3 Y9 K1 C
6 W1 K* ?( y0 S9 F& X3 \, b该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小& l9 J" [! i5 \
0 v" D3 D0 ]0 { u4 O在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址6 [8 }1 k: l0 p" O8 ~2 k- l6 G4 @% s
! ?! B$ r" W. \& ^( ]* O* l
注意:某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会导致无法正确解析堆栈内容
3 s0 t( L( m9 n1 uchar ** backtrace_symbols (void *const *buffer, int size)
9 @) L; w: H) a! s( A6 Y d: s8 ?4 k4 H6 l0 b! k! M
backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组. 参数buffer应该是从backtrace函数获取的指针数组,size是该数组中的元素个数(backtrace的返回值)
_, u- D+ X9 T M8 @, B- D/ |1 m7 O9 [ y$ z8 H
函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名,函数的偏移地址,和实际的返回地址
. s! E: n5 S! v7 S
l, s* p3 R: o. P% L( ~9 V7 a$ ?# g2 |. s1 t
|
|