Android Native崩溃信息分析和 工具(addr2line和ndkstack)使用

这里以一个实际的crash案例未demo进行分析和讲解。针对native的崩溃信息。一般来讲,较快的方式是直接检索到backtrace,然后通过分析和使用工具addr2line和 ndk-stack等定位到出问题的地方。这里截取了一段 崩溃日志,具体如下:

01-15 14:53:40.240 21741 21741 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-15 14:53:40.240 21741 21741 F DEBUG   : Build fingerprint: 'Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C1/eng.wangdsh.20221201.112332:userdebug/test-keys'
01-15 14:53:40.240 21741 21741 F DEBUG   : Revision: 'MP1.0'
01-15 14:53:40.240 21741 21741 F DEBUG   : ABI: 'arm64'
01-15 14:53:40.240 21741 21741 F DEBUG   : Timestamp: 2023-01-15 14:53:39.511121659+0800
01-15 14:53:40.240 21741 21741 F DEBUG   : Process uptime: 0s
01-15 14:53:40.240 21741 21741 F DEBUG   : Cmdline: com.ags.test
01-15 14:53:40.240 21741 21741 F DEBUG   : pid: 21179, tid: 21720, name: SL:21688_21707  >>> com.ags.test <<<
01-15 14:53:40.240 21741 21741 F DEBUG   : uid: 10356
01-15 14:53:40.240 21741 21741 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc0
01-15 14:53:40.240 21741 21741 F DEBUG   : Cause: null pointer dereference
01-15 14:53:40.240 21741 21741 F DEBUG   :     x0  0000006de705b3c0  x1  0000007010bf27cc  x2  0000006d877a78c0  x3  0000006d4a1e79a8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x4  0000000000000018  x5  0000006d7727f17d  x6  3035343234303734  x7  0038303632303534
01-15 14:53:40.240 21741 21741 F DEBUG   :     x8  0000006ce0b67ef0  x9  00000000000000c0  x10 0000006d8702e000  x11 0000000000000030
01-15 14:53:40.240 21741 21741 F DEBUG   :     x12 000000000000000d  x13 000000008ea8faa7  x14 0000000000000030  x15 0000006d4a1e7844
01-15 14:53:40.240 21741 21741 F DEBUG   :     x16 0000006ce0b68670  x17 0000006ce0b60f50  x18 0000006bd3d32000  x19 00000000000054b8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x20 0000006e2705af10  x21 0000006cc2dd7dd8  x22 0000006cc2dd7e20  x23 0000006cc2dcc644
01-15 14:53:40.240 21741 21741 F DEBUG   :     x24 0000006cc2dcc1bb  x25 0000006d877b0920  x26 0000006cc2dcc65f  x27 0000006cc2dcc051
01-15 14:53:40.240 21741 21741 F DEBUG   :     x28 0000006e170f73d0  x29 0000006d4a1e7a30
01-15 14:53:40.240 21741 21741 F DEBUG   :     lr  0000006cc2dcfb04  sp  0000006d4a1e7a10  pc  0000006cc2dcfb0c  pst 0000000060000000
01-15 14:53:40.240 21741 21741 F DEBUG   : backtrace:
01-15 14:53:40.240 21741 21741 F DEBUG   :       #00 pc 0000000000006b0c  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #01 pc 0000000000007adc  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #02 pc 0000000000007e98  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #03 pc 00000000000082f4  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #04 pc 00000000000530e8  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsutils.so (SyncHandle_Loop+324) (BuildId: b828e7b2f3db33f9445278f8a9016949763625a2)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #05 pc 00000000000b1910  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #06 pc 00000000000513f0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)

1 崩溃信息分析

1.1 头信息分析

从提供的崩溃信息头中,也就是这一部分:

01-15 14:53:40.240 21741 21741 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-15 14:53:40.240 21741 21741 F DEBUG   : Build fingerprint: 'Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C1/eng.wangdsh.20221201.112332:userdebug/test-keys'
01-15 14:53:40.240 21741 21741 F DEBUG   : Revision: 'MP1.0'
01-15 14:53:40.240 21741 21741 F DEBUG   : ABI: 'arm64'
01-15 14:53:40.240 21741 21741 F DEBUG   : Timestamp: 2023-01-15 14:53:39.511121659+0800
01-15 14:53:40.240 21741 21741 F DEBUG   : Process uptime: 0s
01-15 14:53:40.240 21741 21741 F DEBUG   : Cmdline: com.ags.test
01-15 14:53:40.240 21741 21741 F DEBUG   : pid: 21179, tid: 21720, name: SL:21688_21707  >>> com.ags.test <<<
01-15 14:53:40.240 21741 21741 F DEBUG   : uid: 10356
01-15 14:53:40.240 21741 21741 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc0
01-15 14:53:40.240 21741 21741 F DEBUG   : Cause: null pointer dereference

我们可以得到以下基本信息:

  • 崩溃时间戳:崩溃发生的时间为 2023-01-15 14:53:39.511121659+0800。
  • 应用程序信息:应用程序的包名为 com.ags.test。
  • 进程信息:崩溃发生时的进程 ID 是 21179,线程 ID 是 21720,线程名称为 SL:21688_21707。
  • 设备信息:设备的 Build fingerprint 为 Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C1/eng.wangdsh.20221201.112332:userdebug/test-keys,ABI 为 arm64。
  • 异常信息:崩溃原因是空指针解引用(null pointer dereference),信号为 11 (SIGSEGV),代码为 1 (SEGV_MAPERR)。崩溃地址为 0xc0。

1.2 寄存器信息分析

从提供的崩溃信息头中,也就是中间这一部分:

01-15 14:53:40.240 21741 21741 F DEBUG   :     x0  0000006de705b3c0  x1  0000007010bf27cc  x2  0000006d877a78c0  x3  0000006d4a1e79a8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x4  0000000000000018  x5  0000006d7727f17d  x6  3035343234303734  x7  0038303632303534
01-15 14:53:40.240 21741 21741 F DEBUG   :     x8  0000006ce0b67ef0  x9  00000000000000c0  x10 0000006d8702e000  x11 0000000000000030
01-15 14:53:40.240 21741 21741 F DEBUG   :     x12 000000000000000d  x13 000000008ea8faa7  x14 0000000000000030  x15 0000006d4a1e7844
01-15 14:53:40.240 21741 21741 F DEBUG   :     x16 0000006ce0b68670  x17 0000006ce0b60f50  x18 0000006bd3d32000  x19 00000000000054b8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x20 0000006e2705af10  x21 0000006cc2dd7dd8  x22 0000006cc2dd7e20  x23 0000006cc2dcc644
01-15 14:53:40.240 21741 21741 F DEBUG   :     x24 0000006cc2dcc1bb  x25 0000006d877b0920  x26 0000006cc2dcc65f  x27 0000006cc2dcc051
01-15 14:53:40.240 21741 21741 F DEBUG   :     x28 0000006e170f73d0  x29 0000006d4a1e7a30
01-15 14:53:40.240 21741 21741 F DEBUG   :     lr  0000006cc2dcfb04  sp  0000006d4a1e7a10  pc  0000006cc2dcfb0c  pst 0000000060000000

其中:

x0-x29分别表示30个寄存器。x0-x29 寄存器是 ARM64 架构中的通用寄存器,用于存储临时数据、函数参数或局部变量等信息。每个寄存器的命名以 x 开头,后面跟着一个数字。这些寄存器整体说明如下:

  • x0-x7: 这些寄存器用于存储函数参数和返回值。x0 是用于存储函数返回值的寄存器,而 x1-x7 用于传递函数参数。
  • x8-x15: 这些寄存器是用于存储临时变量的通用寄存器。它们可以被函数调用时保存和恢复,也可以用于存储中间计算结果。
  • x16-x18: 这些寄存器被称为「保留寄存器」,用于存储特定用途的值,如异常处理等。
  • x19-x28: 这些寄存器通常用于存储局部变量或保存调用者的寄存器状态。它们在函数调用时需要被保存和恢复,以确保函数的正确执行。
  • x29: x29 是帧指针(Frame Pointer),也称为 fp 或者 r29,用于指向当前函数的栈帧(stack frame)。栈帧包含了函数的局部变量、返回地址和其他与函数执行相关的信息。

这些寄存器在程序执行过程中起着关键的作用,用于存储数据、控制流程和传递参数等。它们的具体含义和使用方式可能会根据编程语言、编译器和操作系统的不同而有所差异。

最后一行,也是一组特殊的寄存器,这一组寄存器的含义解读如下:

  • lr: lr 代表链接寄存器(Link Register),也称为返回地址寄存器。它保存了将要执行的下一条指令的地址。在这里,lr 的值为 0000006cc2dcfb04,表示导致崩溃的指令的返回地址。
  • sp: sp 代表堆栈指针(Stack Pointer),指向当前线程堆栈的顶部。在这里,sp 的值为 0000006d4a1e7a10,指示了当前线程堆栈的顶部地址。
  • pc: pc 表示程序计数器(Program Counter),它存储了当前正在执行的指令的内存地址。在这里,pc 的值为 0000006cc2dcfb0c,指示了导致崩溃的指令的内存地址。
  • pst: pst 是指程序状态寄存器(Program Status Register)的值。它是一组用于记录处理器状态和控制处理器行为的位字段。在这里,pst 的值为 0000000060000000,具体的含义可能需要参考特定的处理器架构和指令集。

这些寄存器的值提供了关于崩溃发生时处理器状态的信息。它们对于分析崩溃原因和定位问题可能会有所帮助,但需要结合符号解析和其他调试信息来进行更深入的分析。

1.3 backtrace分析

接下来是我们查找错误中最好的入口,如下所示:

01-15 14:53:40.240 21741 21741 F DEBUG   : backtrace:
01-15 14:53:40.240 21741 21741 F DEBUG   :       #00 pc 0000000000006b0c  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #01 pc 0000000000007adc  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #02 pc 0000000000007e98  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #03 pc 00000000000082f4  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #04 pc 00000000000530e8  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsutils.so (SyncHandle_Loop+324) (BuildId: b828e7b2f3db33f9445278f8a9016949763625a2)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #05 pc 00000000000b1910  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #06 pc 00000000000513f0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)

根据这个backtrace 信息,可以看到它列出了导致崩溃的函数调用链。这些信息对于分析崩溃原因和定位问题非常有帮助。下面是对 backtrace 中主要内容的整体说明:

@1 libagsnetservice.so 中的函数调用链解读:

  • #00 pc 0000000000006b0c: 位于 libagsnetservice.so 库中的地址 0x6b0c 处的函数导致崩溃。
  • #01 pc 0000000000007adc: 位于 libagsnetservice.so 库中的地址 0x7adc 处的函数。
  • #02 pc 0000000000007e98: 位于 libagsnetservice.so 库中的地址 0x7e98 处的函数。
  • #03 pc 00000000000082f4: 位于 libagsnetservice.so 库中的地址 0x82f4 处的函数。

@2 libagsutils.so 中的函数调用链解读:

  • #04 pc 00000000000530e8: 位于 libagsutils.so 库中的地址 0x530e8 处的函数 SyncHandle_Loop 导致崩溃。

@3 libc.so 中的函数调用链:

  • #05 pc 00000000000b1910: 位于 libc.so 库中的地址 0xb1910 处的函数 __pthread_start 导致崩溃。
  • #06 pc 00000000000513f0: 位于 libc.so 库中的地址 0x513f0 处的函数 __start_thread。

这些函数调用链提供了导致崩溃的函数及其所在的库的信息,可以作为定位问题的起点。通过分析这些函数调用链,可以尝试确定导致崩溃的具体函数和库,以便进一步进行调试和修复。

那么怎么查看backtrace确定我们代码中哪一行出问题了呢,这就需要我们使用一些工具将 这些地址转换成具体的函数调用。接下来我们主要使用一些工具及具体的步骤来进行操作。

2 将地址转换成具体的函数调用的工具

2.1 addr2line工具

addr2line 是 GNU binutils 工具集中的一部分,用于将地址转换为源代码行号和函数名。它常用于调试和分析崩溃堆栈,以确定代码中出现问题的具体位置。addr2line 工具的主要功能是根据给定的可执行文件和地址,查找对应的源代码行号和函数名。它可以将机器代码地址映射到编译时生成的源代码位置,提供更具体的错误定位和调试信息。

使用 addr2line 工具进行地址转换的一般步骤如下:

@1 安装 GNU binutils:addr2line在Ubuntu 上可以运行以下命令来安装:

$sudo apt-get install binutils

@2 获取可执行文件和符号表文件:

确保有崩溃时生成的可执行文件(通常是APK或so文件)以及相应的符号表文件(.sym 文件)。符号表文件通常与可执行文件一起生成,并且应该与崩溃时的版本相匹配。

打开终端:打开终端或命令行界面,进入到包含可执行文件和符号表文件的目录。

@3 运行 addr2line 命令:

addr2line命令基本用法解读如下:

addr2line -f -e <可执行文件路径> <地址>-f:显示完整的函数名和文件名。
-e:指定可执行文件的路径。
<地址>:要转换的地址,通常是崩溃堆栈中的地址。

例如,如果你的可执行文件名为 app.so,符号表文件名为 app.so,要转换的地址为 0x12345678,则命令如下:

$addr2line -f -e app.so 0x12345678

针对于该例子,针对0000000000006b0c地址,有:

$addr2line -f -e libagsnetservice.so -a 6b0c

以此类推,就可以得到完整的调用栈的错误了,也就将整个错误信息的地质值转换成代码错误的行数了。

@4 查看转换结果:

运行命令后,addr2line 将会输出对应地址的函数名和源代码行号信息,以及可能的内联函数信息。具体如下所示:

$addr2line -f -e libagsnetservice.so -a 6b0c
0x0000000000006b0c
_ZN4ags18NetServicer9startScanEi
/home/ags/test/core/.../NetService.cpp:473

可以根据这些信息来定位崩溃发生的具体代码行,以此类推,可以得到完整的崩溃栈信息。

注意:addr2line 工具适用于本地崩溃堆栈的地址转换,而不适用于远程崩溃报告。

2.2 ndk-stack

ndk-stack 是 Android NDK(Native Development Kit)提供的一个命令行工具,用于将崩溃堆栈中的地址转换为可读的函数和源代码行号信息。它是开发和调试 Android 应用程序时的有用工具之一。使用 ndk-stack 工具可以帮助开发者定位和分析发生在 Native 层的崩溃问题,例如 C/C++ 代码或使用 JNI(Java Native Interface)与 Java 层交互的代码。

使用 ndk-stack 工具的一般步骤如下:

@1 获取崩溃日志信息(说明:直接复制崩溃信息到crash.log也是可以的)。就是这个信息:

01-15 14:53:40.240 21741 21741 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-15 14:53:40.240 21741 21741 F DEBUG   : Build fingerprint: 'Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C1/eng.wangdsh.20221201.112332:userdebug/test-keys'
01-15 14:53:40.240 21741 21741 F DEBUG   : Revision: 'MP1.0'
01-15 14:53:40.240 21741 21741 F DEBUG   : ABI: 'arm64'
01-15 14:53:40.240 21741 21741 F DEBUG   : Timestamp: 2023-01-15 14:53:39.511121659+0800
01-15 14:53:40.240 21741 21741 F DEBUG   : Process uptime: 0s
01-15 14:53:40.240 21741 21741 F DEBUG   : Cmdline: com.ags.test
01-15 14:53:40.240 21741 21741 F DEBUG   : pid: 21179, tid: 21720, name: SL:21688_21707  >>> com.ags.test <<<
01-15 14:53:40.240 21741 21741 F DEBUG   : uid: 10356
01-15 14:53:40.240 21741 21741 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc0
01-15 14:53:40.240 21741 21741 F DEBUG   : Cause: null pointer dereference
01-15 14:53:40.240 21741 21741 F DEBUG   :     x0  0000006de705b3c0  x1  0000007010bf27cc  x2  0000006d877a78c0  x3  0000006d4a1e79a8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x4  0000000000000018  x5  0000006d7727f17d  x6  3035343234303734  x7  0038303632303534
01-15 14:53:40.240 21741 21741 F DEBUG   :     x8  0000006ce0b67ef0  x9  00000000000000c0  x10 0000006d8702e000  x11 0000000000000030
01-15 14:53:40.240 21741 21741 F DEBUG   :     x12 000000000000000d  x13 000000008ea8faa7  x14 0000000000000030  x15 0000006d4a1e7844
01-15 14:53:40.240 21741 21741 F DEBUG   :     x16 0000006ce0b68670  x17 0000006ce0b60f50  x18 0000006bd3d32000  x19 00000000000054b8
01-15 14:53:40.240 21741 21741 F DEBUG   :     x20 0000006e2705af10  x21 0000006cc2dd7dd8  x22 0000006cc2dd7e20  x23 0000006cc2dcc644
01-15 14:53:40.240 21741 21741 F DEBUG   :     x24 0000006cc2dcc1bb  x25 0000006d877b0920  x26 0000006cc2dcc65f  x27 0000006cc2dcc051
01-15 14:53:40.240 21741 21741 F DEBUG   :     x28 0000006e170f73d0  x29 0000006d4a1e7a30
01-15 14:53:40.240 21741 21741 F DEBUG   :     lr  0000006cc2dcfb04  sp  0000006d4a1e7a10  pc  0000006cc2dcfb0c  pst 0000000060000000
01-15 14:53:40.240 21741 21741 F DEBUG   : backtrace:
01-15 14:53:40.240 21741 21741 F DEBUG   :       #00 pc 0000000000006b0c  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #01 pc 0000000000007adc  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #02 pc 0000000000007e98  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #03 pc 00000000000082f4  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #04 pc 00000000000530e8  /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsutils.so (SyncHandle_Loop+324) (BuildId: b828e7b2f3db33f9445278f8a9016949763625a2)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #05 pc 00000000000b1910  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
01-15 14:53:40.240 21741 21741 F DEBUG   :       #06 pc 00000000000513f0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)

@2 打开终端或命令行界面:

使用ndk-stack时候要注意:和编译app时使用的必须是同一个版本,一般在对应版本的android studio中的sdk目录中。找到自己对应的ndk版本,比如:~/Android/Sdk/ndk/23.0.7599858这种。直接进入到该目录下,后面直接使用该目录下的ndk-stack命令即可,不用再可以配置环境变量等。

@3 运行ndk-stack命令:

ndk-stack命令基本用法解读如下:

ndk-stack -sym <符号表目录>  -dump <日志文件路径>
-sym:指定包含符号表文件(.so 文件)的目录路径。

例如:如果你的crash信息在文件log2023.txt中,则可以:

$ndk-stack -sym path/to/your/symbols -dump log2023.txt

针对于该例子有:

$./ndk-stack -sym path/to/your/symbols  -dump  ./crash.log

其中 path/to/your/symbols 是包含符号表文件的目录路径。ndk-stack 将解析崩溃日志并输出转换后的堆栈跟踪信息,其中包含源代码行数。

@4 查看转换结果:

ndk-stack 将输出转换后的函数名和源代码行号信息,对应于崩溃堆栈中的地址。

$./ndk-stack -sym path/to/your/symbols  -dump  ./crash.log

运行后结果如下所示:

********** Crash dump: **********
Build fingerprint: 'Android/aosp_crosshatch/crosshatch:12/SP1A.210812.016.C1/eng.ags.20221201.112332:userdebug/test-keys'
#00 0x0000000000006b0c /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
ags::NetService::startScan(int)
/home/ags/.../NetService.cpp:473:21#01 0x0000000000007adc /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
IPC_NetService_startScan /home/ags/.../NetServiceStub.cpp:27:45#02 0x0000000000007e98 /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
IPC_NetService_startScan_Stub /home/ags/.../NetServiceStub.c:28:15#03 0x00000000000082f4 /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsnetservice.so (BuildId: bf73aceda3d02c396e5e3ed10ccdd024f0b0ae2c)
IPC_NetService_Request_HandleFunc /home/ags/.../NetServiceStub.c:204:13#04 0x00000000000530e8 /data/app/~~MMvSo__i24fnwmlXX8sFww==/com.ags.test-oDZ54tlfSncUOdIYkSEtWw==/lib/arm64/libagsutils.so (Handle_Loop+324) (BuildId: b828e7b2f3db33f9445278f8a9016949763625a2)
Handle_Loop /home/ags/.../IDL/EventLooper.c:258:17#05 0x00000000000b1910 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
#06 0x00000000000513f0 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)
Crash dump is completed

通过分析ndk-stack的输出,开发者可以确定崩溃发生的具体函数和源代码行号,以及可能的调用栈信息,有助于定位和解决Native层的崩溃问题。实际上这里的一个完整的调用栈就出来了。

注意:ndk-stack 工具也是仅适用于 Native 层的崩溃堆栈转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2311ddip1000不能从函数返回域引用

原文 以下程序无法用-previewdip1000编译: void main() safe {int[3] a [1, 2, 3];int[] slice;//好slice a[];scope ref getSlice() { return slice; }//错误:把对a局部变量的引用赋值给非域getSlice()getSlice() a[]; }getSlice应该可返回可安全地赋值给a[]的引用. 如常…

QtC++与QColumnView详解

介绍 在 Qt 中&#xff0c;QColumnView 是用于显示多列数据的控件&#xff0c;它提供了一种多列列表视图的方式&#xff0c;类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的&#xff0c;通常与 QFileSystemModel 或自定义模型一起使用。 以下是关于 QC…

【文末送书】计算机网络 | IO多路转接技术 | poll/epoll详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

前端对用户名密码加密处理,后端解密

一. 正常表单提交如图&#xff0c;可以看见输入的用户名密码等 二. 使用crypto-js.min.js进行前端加密处理 js资源地址链接&#xff1a;https://pan.baidu.com/s/1kfQZ1SzP6DUz50D–g_ziQ 提取码&#xff1a;1234 前端代码 <script type"text/javascript" src&q…

C#8.0本质论第十四章--事件

C#8.0本质论第十四章–事件 委托本身是一个更大的模式(Pattern)的基本单位&#xff0c;称为Publish-Subscribe(发布-订阅)或Observer(观察者)。 14.1使用多播委托实现Publish-Subscribe模式 14.1.1定义订阅者方法 public class Cooler {public Cooler(float temperature){T…

java命令 jmap 堆参数分析

jmap -heap pid 展示pid的整体堆信息 bash-4.4# jmap -heap 10 Attaching to process ID 10, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.172-b11using thread-local object allocation. Garbage-First (G1) GC with 8 th…

给EmEditor添加自定义外部工具DuilibPreviewer

duilib是一款xml描述UI布局的优秀的c开源界面库&#xff0c;为了方便开发布局UI&#xff0c;有网友制作了预览工具DuilibPreviewer&#xff0c;源码链接https://github.com/juhuaguai/duilib/tree/master/DuilibPreview。 为了进一步方便开发&#xff0c;便于随时预览自己用xm…

kettle创建数据库资源库kettle repository manager

数据库资源库是将作业和转换相关的信息存储在数据库中&#xff0c;执行的时候直接去数据库读取信息&#xff0c;很容易跨平台使用。 创建数据库资源库&#xff0c;如图 1.点击Connect 2.点击Repository Manager 3.点击Other Repository 4.点击Database Repository 在选择Ot…

AI监管规则:各国为科技监管开辟了不同的道路

AI监管规则&#xff1a;各国为科技监管开辟了不同的道路 一份关于中国、欧盟和美国如何控制AI的指南。 编译 李升伟 茅 矛 &#xff08;特趣生物科技有限公司&#xff0c;广东深圳&#xff09; 插图&#xff1a;《自然》尼克斯宾塞 今年5月&#xff0c;科技公司OpenAI首席…

深兰科技成功入选《2023年度国家知识产权优势企业名单》

2023年11月13日&#xff0c;国家知识产权局正式公布了《2023年度国家知识产权优势企业的名单》(以下简称“《名单》”)。深兰人工智能科技(上海)股份有限公司成功入选&#xff0c;荣获“国家知识产权优势企业”称号。 “国家知识产权优势企业”是指企业经营范围属于国家重点发展…

CUDA安装

在cmd中输入nvidia-smi。显示CUDA Version&#xff1a;12.3&#xff0c;所以只能下载小于等于12.3的版本。如下图&#xff1a; 进这个网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 选择一个版本下载。 选择完后之后这样选择&#xff1a; 最后点击下载即…

综述:目标检测二十年(机翻版)(未完

原文地址 20年来的目标检测&#xff1a;一项调查 摘要关键词一 介绍二 目标检测二十年A.一个目标检测的路线图1)里程碑&#xff1a;传统探测器Viola Jones探测器HOG检测器基于可变形零件的模型&#xff08;DPM&#xff09; 2)里程碑&#xff1a;基于CNN的两阶段探测器RCNNSPPN…

axios升级依赖版本后报错SyntaxError: Cannot use import statement outside a module

Axios构建为ES模块&#xff0c;而不是在Node中运行时的CommonJs。Jest的问题是它在Node中运行代码。这就是为什么告诉Jest转换Axios有效的原因。 Axios SDK附带了一个用于Node env的内置CommonJs文件。因此&#xff0c;我们可以通过将以下内容添加到您的package.json来修复它&a…

Ubuntu20.04 安装微信 【wine方式安装】推荐

安装步骤: 第一步:安装 WineHQ 安装包 先安装wine,根据官网指导安装即可。下载 - WineHQ Wikihttps://wiki.winehq.org/Download_zhcn 如果您之前安装过来自其他仓库的 Wine 安装包,请在尝试安装 WineHQ 安装包之前删除它及依赖它的所有安装包(如:wine-mono、wine-gec…

在PostGIS中进行点数据的栅格化

说明 介绍在PotGIS中将点数据转换为栅格数据。 关键字: raster、point、PostGIS 环境准备 Postgresql版本:PostgreSQL 14.0, 64-bitPostGIS版本:POSTGIS="3.3.2"QGIS版本:3.28.3-Firenze基本步骤 一、数据准备 测试数据中有一张点数据表,坐标系3857。 CRE…

.NET6使用MiniExcel根据数据源横向导出头部标题及数据

.NET6MiniExcel根据数据源横向导出头部标题 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 特点: 低内存耗用&#xff0c;避免OOM、频繁 Full GC 情况 支持即时操作每行数据 兼具搭配 LINQ 延迟查询特性&#xff0c;能办到低消耗、快速分页等复杂查询 轻量…

vue.js 短连接 动态连接

有这么一种场景&#xff0c;我们实现了某个业务&#xff0c;现在需要将这个业务连接对外推广以期实现我们的运营、推广、佣金目的&#xff0c;那么我们如何实现呢&#xff1f; 比如这个页面连接为&#xff1a; https://mp.domain.com/user/creation/editor?spm1&userno12…

“一键搜索,海量商品任你选!多平台聚合,购物更便捷!“

对于多平台聚合搜索&#xff0c;根据关键词取商品列表&#xff0c;您需要使用第三方服务或软件来实现。以下是一些可能的选择&#xff1a; 使用第三方聚合搜索工具&#xff1a;有些第三方工具可以聚合多个电商平台的商品数据&#xff0c;并提供统一的搜索接口。您可以使用这些…

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁&#xff1a;分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性&#xff1a;多个进程都能看到结果互斥性&#xff1a;只允许一个持有锁的对象的进入临界资源可用性&#xff1a;无论何时都要保证锁服务的可用性&#x…

查看,取消终端代理

查看 echo $http_proxy echo $https_proxy在 Linux 终端中&#xff0c;你可以使用以下命令取消 HTTP 和 HTTPS 的代理设置&#xff1a; export http_proxy"" export https_proxy""或者使用 unset 命令取消这两个代理设置&#xff1a; unset http_prox…