找回密码
 注册
关于网站域名变更的通知
查看: 251|回复: 1
打印 上一主题 下一主题

怎样在Linux下利用backtrace追踪函数调用堆栈以及定位段错误

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-19 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-9-19 18:05 | 只看该作者
看看怎样在Linux下利用backtrace追踪函数调用堆栈以及定位段错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:37 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表