如何在android中获取堆栈跟踪c ++函数名称

时间:2012-02-29 15:53:09

标签: android c++ android-ndk stack-trace

我正在寻找我的应用程序中的本机崩溃,但我找不到一个工具,可以帮助我将地址转换为我的库中的函数名称我看到这篇文章: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的另一种方式?

3 个答案:

答案 0 :(得分:1)

不,不是真的。为此,您需要手动执行搜索。

手动,有三个选项:

  • 添加调试打印以找出发生的位置和时间

  • 使用IDA pro(这是非常昂贵的工具),将库加载到其中并查找地址81b6a4a0,尝试找出它是哪个函数。如果使用调试符号进行编译,则应该很容易。

  • 找到库的基地址,使用objdump(来自NDK工具链)查找地址81b6a4a0中的内容(从中删除基址后)。

在最后两种方式中,如果您没有找到任何有用的信息,请使用 adb libc.so libdvm.so >并尝试查找堆栈跟踪中显示的功能,然后检查代码中您将这些功能称为何处。

答案 1 :(得分:0)

看看this。我还没有时间尝试,所以告诉你是否适合你

答案 2 :(得分:0)

您可以使用GDB来获取堆栈跟踪。如果您有root电话或使用模拟器,则可以启用核心转储。然后,您可以使用GDB来检查核心转储。

请参阅此问题以在Eclipse中设置GDB:

android how to use ndk gdb with a pure native executable