调试小工具
  5SL1O36RFEWc 2023年11月02日 102 0

定位

工具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

readelf命令使用


工具4:tcpdump

  pidstat-查看线程cpu使用率

  tcpdump抓取组播报文

  超详细的网络抓包神器 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 查看所有线程堆栈信息

两种调试死锁的方法_thread apply all bt

  • 某线程CPU负载过高

可以使用pidstat 、或者tool下perf来定位

  • 线程栈资源泄露

若频繁创建线程未回收

  • 内存泄漏


二进制定位:

通过backtrace得到的错误地址减去该模块代码段的起始虚拟地址(maps),得到的差值可定位到代码行号;

addr2line 可得到代码行号;

Linux下addr2line命令用法

含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。

so库定位:

addr2line 调试


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  eVzzROmRiJco   2023年11月19日   21   0   0 linux
  zLxnEsMLk4BL   2023年11月19日   31   0   0 变量名字符串bclinux
  eVzzROmRiJco   2023年11月19日   20   0   0 内核链表linux
5SL1O36RFEWc
作者其他文章 更多

2023-11-12

2023-11-12

2023-11-12

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02