backtrace实操总结

-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 //软件终止信号
SET_SIG(SIGSTKFLT ) 16 //协处理器上的栈故障
SET_SIG(SIGXFSZ) 25 //文件大小超出限制
SET_SIG(SIGTRAP

猜你喜欢

转载自blog.csdn.net/wade_510/article/details/103242993