NDK调试的新得

本文详细介绍了在NDK环境中进行调试时如何利用addr2line命令定位错误地址所在的函数和文件位置,以及当遇到不带符号表的库时如何通过objdump进行反汇编定位。文章还提供了实例分析,帮助开发者解决复杂调试问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NDK调试的新得



addr2line -f -e [lib/exe] [address]
addr2line可以反向定位出错的地址在哪个函数和哪个文件的多少行
-f 显示函数名
-e 指定可执行文件或者库,如果不指定,默认输入为a.out

address 注意:
在arm上,报错的时候,会提示pc寄存器先后入栈的指令
一般而言,最近的进入pc寄存器的指令为出错的地方
但是某些函数调用很频繁,无法确认上下文,那么就需要一个个的查询

但是如果库不带symbols,那么我们就需要动用objdump了
例如:
#00  pc 0003de8a  /system/lib/libandroid_runtime.so

#01  pc 00010e74  /system/lib/libdvm.so

#02  pc 0003f3a4  /system/lib/libdvm.so

#03  pc 00015dd4  /system/lib/libdvm.so

#04  pc 0001c904  /system/lib/libdvm.so

#05  pc 0001b798  /system/lib/libdvm.so

#06  pc 000568ee  /system/lib/libdvm.so

#07  pc 0005ef54  /system/lib/libdvm.so

#08  pc 00015dd4  /system/lib/libdvm.so

#09  pc 0001c904  /system/lib/libdvm.so

#10  pc 0001b798  /system/lib/libdvm.so

#11  pc 0005672c  /system/lib/libdvm.so

#12  pc 00041d1e  /system/lib/libdvm.so

#13  pc 0002dc14  /system/lib/libandroid_runtime.so

#14  pc 0002ed10  /system/lib/libandroid_runtime.so

#15  pc 00008ca8  /system/bin/app_process

#16  pc 0000d410  /system/lib/libc.so



以上都是strip掉symbols符号表的库,addr2line无法查看

objdump -s -d [lib/exe] >out.txt
反汇编可执行程序
把/system/lib/libdvm.so从手机里拖出来,在外面反汇编得到out.txt(建议使用gvim查看,打开速度快,查找快,方便)
3de8a地址就位于dvmGetStaticFieldShort函数中
10e74在dvmPlatformInvoke
3f3a4没有直接定位,但是3f3a2和3f3a6都在dvmCallJNIMethod_general中,那么3f3a4也在
15dd4在dvmJitToInterpNoChain
1c904在dvmMterpStd
1b798在dvmInterpret
568ee没有直接定位,但是568ec和568f0都在dvmInvokeMethod中,那么568ee也在
5ef54在dvmFreeDexOrJar
15dd4在dvmJitToInterpNoChain
1c904在dvmMterpStd
1b798在dvmInterpret
5672c没有直接定位,但是5672a和5672e都在dvmCallMethodV中,那么5672c也在

基本判断,应该是jni调用部分出错,目前在跟踪中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值