我正在寻找我的应用程序中的本机崩溃,但我找不到一个工具,可以帮助我将地址转换为我的库中的函数名称我看到这篇文章:how to use addr2line但似乎只有在你有这样的痕迹:
I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG ( 31): pid: 378, tid: 386 >>> com.example.gltest <<<
I/DEBUG ( 31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 31): r0 001dbdc0 r1 00000001 r2 00000000 r3 00000000
I/DEBUG ( 31): r4 00000000 r5 40a40000 r6 4051a480 r7 42ddbee8
I/DEBUG ( 31): r8 43661b24 r9 42ddbed0 10 42ddbebc fp 41e462d8
I/DEBUG ( 31): ip 00000001 sp 436619d0 lr 83a12f5d pc 8383deb4 cpsr 20000010
I/DEBUG ( 31): #00 pc 0003deb4 /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG ( 31): #01 pc 00039b76 /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG ( 31): #02 pc 00017d34 /system/lib/libdvm.so
你可以在最后3行看到你的应用程序库在那里: ibnativemaprender.so
只有当你的图书馆出现在那里时,addr2line应用程序才能正常工作
但在我看来我有这个:
I/DEBUG (16251): #00 pc 000161c0 /system/lib/libc.so
I/DEBUG (16251): #01 lr afd196f1 /system/lib/libc.so
我的图书馆直到稍后才显示:
/DEBUG (16251): stack:
I/DEBUG (16251): 46f0c818 afd426a4
I/DEBUG (16251): 46f0c81c 000b7290
I/DEBUG (16251): 46f0c820 00000afa
I/DEBUG (16251): 46f0c824 afd187b9 /system/lib/libc.so
I/DEBUG (16251): 46f0c828 afd42644
I/DEBUG (16251): 46f0c82c afd467c4
I/DEBUG (16251): 46f0c830 00000000
I/DEBUG (16251): 46f0c834 afd196f1 /system/lib/libc.so
I/DEBUG (16251): 46f0c838 00000001
I/DEBUG (16251): 46f0c83c 46f0c86c
I/DEBUG (16251): 46f0c840 81b6a4a0 /data/data/com.android.ANMP/lib/mylib.so
那么有什么工具可以帮助我吗?或者使用addr2line的另一种方式?
答案 0 :(得分:1)
不,不是真的。为此,您需要手动执行搜索。
手动,有三个选项:
添加调试打印以找出发生的位置和时间
使用IDA pro(这是非常昂贵的工具),将库加载到其中并查找地址81b6a4a0
,尝试找出它是哪个函数。如果使用调试符号进行编译,则应该很容易。
找到库的基地址,使用objdump(来自NDK工具链)查找地址81b6a4a0
中的内容(从中删除基址后)。
在最后两种方式中,如果您没有找到任何有用的信息,请使用 adb libc.so 和 libdvm.so >并尝试查找堆栈跟踪中显示的功能,然后检查代码中您将这些功能称为何处。
答案 1 :(得分:0)
看看this。我还没有时间尝试,所以告诉你是否适合你
答案 2 :(得分:0)
您可以使用GDB来获取堆栈跟踪。如果您有root电话或使用模拟器,则可以启用核心转储。然后,您可以使用GDB来检查核心转储。
请参阅此问题以在Eclipse中设置GDB: