定位crash问题

使用反汇编精确到一条汇编指令
addr2line可以精确到哪一行代码,但是一行代码可能对应多条指令,所以如果条件允许的话,拿到带有符号表的算法库,反汇编到具体指令。
工作中出现一个crash,首先定位到具体语句
mDevice->getPixFmt(frameMsg->mFrame, &frameFmt);
如果单看这条语句,涉及两个指针,那究竟是哪个指针有问题,通过反汇编+上下文,我们可以定位出具体哪个指针出问题了。

反汇编如下:
add x2, sp, #0x14 //&mFrameFmt
ldr x0, [x20, #48] //mDevice
ldr x1, [x19, #16] //frameMsg->mFrame
ldr x8, [x0] //crash!!!!!
ldr x8, [x8, #416]

通过源码分析,mDevice变量本身分配在栈上,获取到mDevice值,它是一个指针,再取它对应地址的值出现crash,地址非法。

也就是说mDevice变量被踩,导致非法内存。

这个问题还可以仔细研究下:
1、虚函数,
虚函数在虚函数表中是按声明顺序排列的,是通过虚函数表来调用的。
mDevice指向一个类,是这个类的起始地址,也是这个类的虚函数表的地址,虚函数表一般放在类的起始位置。从而获得这个虚函数表地址,虚函数在虚函数表中是按声明顺序排列的的,所以代码中直接偏移#416找到虚函数地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值