android 定位 闪退_记一次Android So错误定位

366dc8c749b3e9eb284e50e59d899707.gif

0x01 远程调试
USB外接摄像头因为要占用type c接口,所以必须要远程调试。这里使用mate20远程调试,需要注意一点,要在设备中开启`"仅充电"模式下允许ADB调试`。
插上数据线,之后在同一WIFI环境下。

adb tcpip 5556
adb connect 192.168.1.185:5556  // ip:port

远程调试模式成功创建,之后数据线拔掉,直接可用android studio调试应用了。0x02 常规错误定位
插上外接摄像头,我使用的是usbcameraTest8应用,复现拔掉外接闪退的bug,在Logcat中筛选DEBUG,有以下报错信息。

87e3322ebf35125be652f56ee114a46a.png


错误定位在文件libusb100.so中,报错是一个空指针错误。
使用android ndk下的arm-linux-androideabi-addr2line.exe工具,根据位置定位函数。

arm-linux-androideabi-addr2line.exe -e e:\libusb100.so 11d3c -f

0f5e7522f0556e570757cab0ba1414da.png


全是??:?问号,function name是android_device_disconnected,但是调试中发现就算把这个函数注释掉也会报错,果断放弃。0x03 柳暗花明
针对??:?的解决办法,网上有很多,但是试过了都不能使用,这里想到了神器IDA。libusb100.so直接导入IDA,找到11d3c这个位置点。F5反汇编,得到下伪代码。

c937547bed438d9f89d5088d3438d77b.png


定位到这个位置,也有字符串,很容易找到源码中的错误位置。

for (i = 0; i < num_urbs; i++) {
        if (urb == tpriv->iso_urbs[i]) {
                urb_idx = i + 1;
                break;
        }
}

测试发现这里可能存在空指针iso_urbs
增加这段代码问题解决。

if(tpriv->iso_urbs == NULL){
    break;
}

e2c8518f7febeaab3d968e869b8704de.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值