【问题标题】:How to use addr2line in Android如何在 Android 中使用 addr2line
【发布时间】:2011-07-15 21:39:51
【问题描述】:

我的应用程序卡住了,因为我无法调试,因为它是一个多线程的应用程序并且崩溃并出现错误 SIGSEGV。我从 LogCat 获得了很多信息,它提供了我本地库中的地址。如果我可以将这些地址转换为我的代码,那将会很有帮助。

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

【问题讨论】:

    标签: android android-ndk shared-libraries native-code addr2line


    【解决方案1】:

    现在有一种更简单的方法可以做到这一点(ndk-r7)。查看 ndk-stack 命令。文档位于 you_android_ndk_path/docs/NDK-STACK.html

    【讨论】:

    • 我尝试了 svdree 的第一个答案,但没有得到任何好的输出。我尝试了这个,它向我显示了我的代码崩溃的确切行!谢谢拜伦!
    • 比以前的 addr2line 容易多了!
    • 我非常想要一个链接/资源,如果你能放一个的话。
    • 这真是太好了! (ndk-stack.html)[developer.android.com/ndk/guides/ndk-stack.html]
    • "包含应用共享库的符号版本的目录。"我们如何找到 xamarin forms android 应用程序的共享库
    【解决方案2】:

    假设 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
    

    查看最后 3 行;这是你的调用堆栈。 '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++ 代码
    • 使用 .so 文件 obj/local/armeabi,因为这是 非剥离版本

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

    【讨论】:

    • 太棒了,太棒了。感谢您的详细回答。它对我有用 100%。谢谢你,并为你投票。
    • 太棒了,多亏了你,我在使用libs 中的.so 文件时遇到了困难,这当然被剥离了。 obj 中的那个有效。
    • avdree - 我鼓励您在这个非常好的答案中展示 add2line 的实际输出。
    • 只是一个注释,addr2line 实用程序可以与任何(GNU 生产的?)包含调试符号的二进制文件一起使用。也适用于桌面和嵌入式目标 :)
    • 我想将您的注意力转移到第二个注释上:使用 obj/local/ 下的 .so 文件。救生员
    猜你喜欢
    • 2012-07-07
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2018-05-25
    • 2016-03-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多