繁体   English   中英

如何在Android中获取堆栈跟踪C ++函数名称

[英]how to get stack trace c++ functions names in android

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

正如您在最后三行中看到的那样,您的应用程序的库在那里: 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的另一种方式?

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

手动有三个选项:

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

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

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

在后两种方法中,如果找不到任何有用的方法,请使用adb从设备中拉出libc.solibdvm.so并尝试查找出现在堆栈跟踪中的函数,然后检查在哪里调用这些函数在您的代码中。

看看这个 我还没有时间尝试,所以请告诉是否为您工作

您可以使用GDB获取堆栈跟踪。 如果您的手机已扎根或使用仿真器,则可以启用核心转储。 然后,您可以使用GDB检查核心转储。

有关在Eclipse中设置GDB的信息,请参见以下问题:

android如何将ndk gdb与纯本地可执行文件一起使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM