常见死机定位方法gdb addr2line objdump

这里记录总结,自己学习定位死机问题的思路方法。(2022/05/18 23:21)
再牛逼的梦想,也抵不住傻逼般的坚持!

前言:
学习背景:为什么要了解学习定位死机问题的方法?
三种方法对比:三种方法的区别,优缺点。
如下可能不完善,会逐步完善。在解决问题中成长

方法一:gdb 通过coredump文件定位死机问题 (案例讲解–栈地址被踩问题分析)
1) 执行 test程序
./xxx-gdb test (gdb + 可执行进程文件)
2) 加载动态库路径
set solib-absolute-prefix /opt/arm-sgmstar-gnueabihf-9.1.0-202007/gcc-sigmastar-9.1.0-2020.07-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/
set solib-search-path /opt/arm-sgmstar-gnueabihf-9.1.0-202007/gcc-sigmastar-9.1.0-2020.07-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
(新增查询动态库路径方法:a.which+xxx-gdb b.在a查询到的目录的上级目录中查找sysroot目录下的lib确认有c++,libc等等动态库)
3) 加载coredump文件,还原事发现场
core-file core.pid(core-file + 产生的core文件)
4) 栈追溯(backtrace)
bt
5) 反汇编
disassemble
6)其他
a. f x(fram x;x:第x个函数栈帧)(可利用disassemble对该函数进行反汇编,利用info r查看当前寄存器值)
同过info r可查看到sp栈帧,可通过x/1024xw + sp地址,向上查看1024的地址数据信息
通过(gdb) source ./findBackTrace(自己编写的py小脚本)加载脚本。findBackTrace sp count startText endText 查找指定sp之上count大小的地址中在代码段的地址。 其中findBackTrace 脚本由于篇幅限制,可查看另外一篇文章https://blog.csdn.net/Bgm_Nilbb/article/details/131069755?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131069755%22%2C%22source%22%3A%22Bgm_Nilbb%22%7D
b. info threads(线程简要信息呈现)
c. t x(thread x;切换至某个线程中去, x:线程号)
d. thread apply all bt(打印所有线程回溯)
e. info proc mappings(打印进程的各个段;包括起始地址,终止地址等)
f. info sharedlibrary (查看动态库加载情况)
g.info locals(查看当前帧中的局部变量)
h.info r(查看当前寄存器值)
方法二:addr2line
xxx-addr2line -e test -psfC 00334526
运行结果:地址在代码中的位置
参数解析:
xxx: 不同工具链需要用对应的addr2line工具
-e:
test:可执行文件
-psfC:
00334526:堆栈地址

方法三:objdump
xxx-objdump -Sz file >> bgm.txt
运行结果:反汇编file文件(之后可以通过查找EPC、LR等地址的临近地址,分析死机位置)

参数解析:
xxx:不同工具链需要用对应的objdump工具
-Sz:
file:需要反编译的文件

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值