定位
工具1:strip
作用:可以去除调试信息,减小二进制体积,也可避免通过二进制获取更多信息。
eu-strip:
eu-strip可以把文件的符号表保存起来,需要用的时候,导入需要的符号表就能调试coredump文件了。
//安装eu-strip
sudo apt-get install elfutils
https://blog.csdn.net/tsh123321/article/details/89707998
其他工具:addrlinr、nm、readelf,定位分析问题
工具2:nm
通过nm找到全局变量前后的变量。
例:nm A.service.B | c++filt | grep 'hse'
工具3:readelf
工具4:tcpdump
pidstat-查看线程cpu使用率
tcpdump抓取组播报文
分析问题、解决
程序已经退出,拿到调试信息
- 全局变量被踩踏:可通过nm找到全局变量前后的一些变量。检查他们的使用memcpy、strcpy、memset是否越界,或者数组array[-100]是否越界。
- 栈数据被踩踏
检查局部变量的使用情况
可通过异常的栈地址,定位到哪个线程栈:进入线程时打印第一个局部变量的地址和线程
- 堆数据被踩踏
Map 里申请的 添加标志位、行号、大小
C++ lib的hook机制,hook机制,钩子出去管理内存。
第三方库管理
- STL容器的段错误
查看所有线程bt指令
bt:backtrace就是回溯堆栈,简单来说是可以列出当前函数调用关系。
https://doc.embedfire.com/linux/imx6/base/zh/latest/linux_debug/gdb_use.html#id3
程序还在,功能异常
- 线程异常退出,或某函数阻塞
可以引入线程异常退出(pthread_kill)、线程循环超时,函数执行超时等机制,在第一时间抛出异常,方便调试。
- 死锁或阻塞
thread apply all bt 查看所有线程堆栈信息
- 某线程CPU负载过高
可以使用pidstat 、或者tool下perf来定位
- 线程栈资源泄露
若频繁创建线程未回收
- 内存泄漏
二进制定位:
通过backtrace得到的错误地址减去该模块代码段的起始虚拟地址(maps),得到的差值可定位到代码行号;
addr2line 可得到代码行号;
当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。
so库定位:
addr2line 调试