如何在Android中使用addr2line

80

我被我的应用卡住了,因为它是一个多线程的应用程序,出现错误SIGSEGV而无法调试。 我从LogCat中获取了许多信息,其中包含我的本地库中的地址。 如果我能将这些地址转换为我的代码,那将非常有帮助。

有人知道如何使用与android-ndk一起提供的addr2line吗?

2个回答

175

假设logcat向您显示了以下崩溃日志(来自我的某个项目):

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

看最后三行;这是你的调用堆栈。'pc'是程序计数器,堆栈帧#00的pc给出了崩溃发生的地址。这个地址是传递给addr2line的数字。

我正在使用NDK r5,所以我正在使用的可执行文件位于 $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin;确保它在你的$PATH中。要使用的命令看起来像:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>

或者,对于上述情况:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

这将给你崩溃的位置。

注意:

  • -C标志是用于解析C++代码的
  • 请使用obj/local/armeabi下的.so文件,因为这是未剥离的版本

此外,在使用带有2.3 AVD的NDK r5时,实际上可以调试多线程代码。


1
太好了,非常棒。感谢您提供详细的答案。它对我百分之百有效。谢谢你,我会给你点赞。 - NoAIUser
1
太棒了,多亏了你,我终于把它搞定了 - 我一直在努力使用libs中的.so文件,但是它被剥离了。而在obj中的那个可以用。 - Nick
我没有使用除 android-support-v4 以外的任何原生库。因此,我能否使用 addr2line 工具获取Java文件中崩溃的行号?我已经在 [https://dev59.com/54rda4cB1Zd3GeqPOJNx] 中添加了详细信息。 - Kushal
2
我想将您的注意力转移到第二个注释上:使用obj/local/<ABI>下的.so文件。救命稻草。 - fillobotto
1
arm-linux-androideabi-addr2line: 'obj/local/armeabi/libart.so': 没有这个文件 为什么? - Angelina
显示剩余4条评论

49

现在有一种更简单的方法(ndk-r7版本),可以使用ndk-stack命令来查看文档。文档位于你的android_ndk_path/docs/NDK-STACK.html。


1
我尝试了svdree的第一个答案,但没有得到任何好的输出。我尝试了这个答案,它向我展示了我的代码崩溃的确切行!谢谢Byron! - alk3ovation
比起以前使用的addr2line要容易得多! - Josh
1
如果您能提供链接/资源,我会非常感激。 - Ehtesh Choudhury
这真的很好!(ndk-stack.html) [https://developer.android.com/ndk/guides/ndk-stack.html] - Aadishri
2
“包含应用程序共享库符号版本的目录。”我们如何找到 Xamarin Forms Android 应用程序的共享库? - George Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接