通过豆包搜索:windows ndk-stack 使用
ndk-stack 路径:使用 Android\Sdk\ndk-bundle\ndk-stack.cmd
adb logcat > crash_log.txt
符号表 /so 文件路径:(obj 目录下的 so 包含完整符号表)app\build\intermediates\cmake\debug\obj\arm64-v8a\libplayer.so
一、首先要验证 obj 目录的 so 是否包含符号表
# 1. 切换到NDK的工具目录(以arm64-v8a为例)
cd D:\Android\Sdk\ndk\25.2.9519653\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin
# 2. 执行readelf查看符号表
aarch64-linux-android-readelf.exe -S D:\MyProject\app\src\main\obj\local\arm64-v8a\libffmpeg.so
示例:
C:\Users\jack\AppData\Local\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin>llvm-readelf.exe -S G:\tmp\MyApp11\app\build\intermediates\cmake\debug\obj\arm64-v8a\libplayer.so
There are 35 section headers, starting at offset 0x30544a0:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .note.android.ident NOTE 0000000000000238 000238 000098 00 A 0 0 4
[ 2] .note.gnu.build-id NOTE 00000000000002d0 0002d0 000024 00 A 0 0 4
[ 3] .dynsym DYNSYM 00000000000002f8 0002f8 0233d0 18 A 7 1 8
[ 4] .gnu.version VERSYM 00000000000236c8 0236c8 002efc 02 A 3 0 2
[ 5] .gnu.version_r VERNEED 00000000000265c4 0265c4 000070 00 A 7 3 4
[ 6] .gnu.hash GNU_HASH 0000000000026638 026638 00b128 00 A 3 0 8
[ 7] .dynstr STRTAB 0000000000031760 031760 022350 00 A 0 0 1
[ 8] .rela.dyn RELA 0000000000053ab0 053ab0 084630 18 A 3 0 8
[ 9] .rela.plt RELA 00000000000d80e0 0d80e0 001398 18 AI 3 21 8
[10] .gcc_except_table PROGBITS 00000000000d9478 0d9478 000d08 00 A 0 0 4
[11] .rodata PROGBITS 00000000000da180 0da180 262f40 00 AMS 0 0 32
[12] .eh_frame_hdr PROGBITS 000000000033d0c0 33d0c0 03370c 00 A 0 0 4
[13] .eh_frame PROGBITS 00000000003707d0 3707d0 0a9e40 00 A 0 0 8
[14] .text PROGBITS 000000000041a620 41a620 567690 00 AX 0 0 32
[15] .plt PROGBITS 0000000000981cb0 981cb0 000d30 00 AX 0 0 16
[16] .data.rel.ro PROGBITS 00000000009839e0 9829e0 081df0 00 WA 0 0 8
[17] .fini_array FINI_ARRAY 0000000000a057d0 a047d0 000010 00 WA 0 0 8
[18] .init_array INIT_ARRAY 0000000000a057e0 a047e0 000010 00 WA 0 0 8
[19] .dynamic DYNAMIC 0000000000a057f0 a047f0 0001f0 10 WA 7 0 8
[20] .got PROGBITS 0000000000a059e0 a049e0 003480 00 WA 0 0 8
[21] .got.plt PROGBITS 0000000000a08e60 a07e60 0006a0 00 WA 0 0 8
[22] .data PROGBITS 0000000000a0a500 a08500 0010d0 00 WA 0 0 8
[23] .bss NOBITS 0000000000a0b5e0 a095d0 1440e40 00 WA 0 0 32
[24] .comment PROGBITS 0000000000000000 a095d0 000222 01 MS 0 0 1
[25] .debug_abbrev PROGBITS 0000000000000000 a097f2 0ea8cc 00 0 0 1
[26] .debug_info PROGBITS 0000000000000000 af40be 13fc36d 00 0 0 1
[27] .debug_ranges PROGBITS 0000000000000000 1ef042b 0f9e40 00 0 0 1
[28] .debug_str PROGBITS 0000000000000000 1fea26b 0f1d53 01 MS 0 0 1
[29] .debug_line PROGBITS 0000000000000000 20dbfbe 3c6589 00 0 0 1
[30] .debug_loc PROGBITS 0000000000000000 24a2547 99ab7a 00 0 0 1
[31] .debug_aranges PROGBITS 0000000000000000 2e3d0c1 000690 00 0 0 1
[32] .symtab SYMTAB 0000000000000000 2e3d758 13e6a8 18 34 48330 8
[33] .shstrtab STRTAB 0000000000000000 2f7be00 000172 00 0 0 1
[34] .strtab STRTAB 0000000000000000 2f7bf72 0d852d 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
- 如果输出中包含
[32] .symtab(符号表段)、[34] .strtab(字符串表段),说明符号表完整; - 如果这些段不存在,说明 so 已被剥离符号表。
二、开始解析(ndk-stack 输出):
# 核心命令格式
D:\Android\Sdk\ndk\25.2.9519653\ndk-stack.cmd -sym 你的so符号表目录 -dump crash_log.txt
具体示例如下:
C:\Users\jack\AppData\Local\Android\Sdk\ndk-bundle>ndk-stack.cmd -sym G:\tmp\MyApp11\app\build\intermediates\cmake\debug\obj\arm64-v8a\libplayer.so -dump G:\tmp\tmp_log\crash_log.txt
********** Crash dump: **********
Build fingerprint: 'HUAWEI/SEA-AL10/HWSEA-A:10/HUAWEISEA-AL10/104.0.0.121C00:user/release-keys'
#00 0x000000000006baf0 /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+96) (BuildId: b91c775ccc9b0556e91bc575a2511cd0)
#01 0x0000000000422dfc /data/app/com.Ling.player-pQuyWpT6I3Dz4I02Bvk3Mg==/base.apk!libplayer.so (offset 0x4b1000) (LingPlayer::start_()+344) (BuildId: ca487aac8417e18afaeb72f37a9309550d976984)
#02 0x0000000000422c90 /data/app/com.Ling.player-pQuyWpT6I3Dz4I02Bvk3Mg==/base.apk!libplayer.so (offset 0x4b1000) (task_start(void*)+28) (BuildId: ca487aac8417e18afaeb72f37a9309550d976984)
#03 0x00000000000cf7c0 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: b91c775ccc9b0556e91bc575a2511cd0)
#04 0x00000000000721a8 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: b91c775ccc9b0556e91bc575a2511cd0)
Crash dump is completed