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调用部分出错,目前在跟踪中