backtrace实操总结

本文介绍了-g和-rdynamic在编译和链接过程中的作用,重点讨论了如何使用backtrace函数,强调了ELF二进制格式和-rdynamic选项的重要性。还提到了在优化编译时的注意事项,如避免某些优化选项干扰堆栈信息,以及如何处理各种信号以获得正确的backtrace。此外,还分享了如何通过环境变量控制backtrace输出到文件中,并给出了不同编译选项对程序大小的影响。
摘要由CSDN通过智能技术生成

-g与-rdynamic的异同:

-g 是一个编译选项,在编译的过程中起作用,把更多调试信息(也就包括符号信息)存放到最终的可执行文件内。
-rdynamic 是一个连接选项,将指示连接器把所有符号都添加到动态符号表(即.dynsym表)里,以便dlopen()或backtrace()这样的函数使用。

要使用 backtrace 函数, 有两点要求:

1)程序使用的是 ELF 二进制格式.
2)程序连接时使用了 -rdynamic 选项.
-rdynamic可用来通知链接器将所有符号添加到动态符号表中, 这些信息比 -g 选项的信息要少得多.

注意事项:

① 某些编译器的优化选项对获取正确的调用堆栈有干扰, 另外内联函数没有堆栈框架;
删除框架指针也会导致无法正确解析堆栈内容;

② backtrace使用,最好被监控的信号:
https://www.cnblogs.com/frisk/p/11602973.html
SET_SIG(SIGILL) 4 //非法指令
SET_SIG(SIGBUS) 7 //总线错误
SET_SIG(SIGFPE) 8 //浮点异常,即除0异常
SET_SIG(SIGABRT) 6 //来自abort函数的终止信号
SET_SIG(SIGSEGV) 11 //无效的存储器引用(段错误)
SET_SIG(SIGPIPE ) 13 //向一个没有读用户的管道做写操作
SET_SIG(SIGTERM) 15 //软件终

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值