android NDK 报错日志解读和还原报错方法名
Android NDK 的报错日志通常是
Process name is com.exemple.test, uid is 10293, not key_process
08-06 13:50:08.211 11744 11744 F DEBUG : keyProcess: 0
08-06 13:50:08.211 11744 11744 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
08-06 13:50:08.211 11744 11744 F DEBUG : Build fingerprint: 'OPPO/PKB110/OP5A3DL1:16/BP22.250124.009/V.bb172a_115bea7_115bea6:user/release-keys'
08-06 13:50:08.211 11744 11744 F DEBUG : Revision: '0'
08-06 13:50:08.211 11744 11744 F DEBUG : ABI: 'arm64'
08-06 13:50:08.211 11744 11744 F DEBUG : Timestamp: 2025-08-06 13:50:08.113184634+0800
08-06 13:50:08.211 11744 11744 F DEBUG : Process uptime: 1s
08-06 13:50:08.211 11744 11744 F DEBUG : Cmdline: com.exemple.test
08-06 13:50:08.211 11744 11744 F DEBUG : pid: 11719, tid: 11719, name: >>> com.exemple.test <<<
08-06 13:50:08.211 11744 11744 F DEBUG : uid: 10293
08-06 13:50:08.211 11744 11744 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
08-06 13:50:08.211 11744 11744 F DEBUG : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
08-06 13:50:08.211 11744 11744 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x000000000000000c
08-06 13:50:08.211 11744 11744 F DEBUG : Cause: null pointer dereference
08-06 13:50:08.211 11744 11744 F DEBUG : x0 b40000725d295720 x1 0000007febbbd8b8 x2 0000000000000000 x3 000000000000000c
08-06 13:50:08.211 11744 11744 F DEBUG : x4 0000007febbbc1d0 x5 0000007febbbc1d4 x6 1b2d0f3b11d2c7a2 x7 0000007254ee2854
08-06 13:50:08.211 11744 11744 F DEBUG : x8 0000000000000000 x9 000000000000000c x10 0000000000000000 x11 0000000002000000
08-06 13:50:08.211 11744 11744 F DEBUG : x12 0000007febbbc3e0 x13 00000072558d6988 x14 0000007254d83ef8 x15 00000000ebad6a89
08-06 13:50:08.211 11744 11744 F DEBUG : x16 0000007254ef63d0 x17 0000007febbbd7c0 x18 0000007316738000 x19 b40000725d33fc00
08-06 13:50:08.211 11744 11744 F DEBUG : x20 0000000000000000 x21 b40000725d33fcd0 x22 0000000000000002 x23 0000000000000000
08-06 13:50:08.211 11744 11744 F DEBUG : x24 0000007febbbd934 x25 000000006f8774a8 x26 0000000000000000 x27 000000006f8774a8
08-06 13:50:08.211 11744 11744 F DEBUG : x28 0000007febbbd7d0 x29 0000007febbbd7a0
08-06 13:50:08.211 11744 11744 F DEBUG : lr 0000007254d9b304 sp 0000007febbbd7a0 pc 0000007254ef6454 pst 0000000080001000
08-06 13:50:08.211 11744 11744 F DEBUG : 153 total frames
08-06 13:50:08.211 11744 11744 F DEBUG : backtrace:
08-06 13:50:08.211 11744 11744 F DEBUG : #47 pc 0000000000003edc /data/app/~~tVaSKAxiJWSXvsD1y19YvA==/com.exemple.test-P6Nt-CeYxb48yv-4c2KiXQ==/lib/arm64/libtest.so (BuildId: e8db9578fbb84b6267d28e3300a51e048bf04d6c)
关键点就在最后一句
#47 pc 0000000000003edc /data/app/~~tVaSKAxiJWSXvsD1y19YvA==/com.exemple.test-P6Nt-CeYxb48yv-4c2KiXQ==/lib/arm64/libtest.so (BuildId: e8db9578fbb84b6267d28e3300a51e048bf04d6c)
#47 是调用帧
0000000000003edc 是错误发生的相对偏移地址
/data/app/~~tVaSKAxiJWSXvsD1y19YvA==/com.exemple.test-P6Nt-CeYxb48yv-4c2KiXQ==/lib/arm64/libtest.so 是错误发生的动态库
BuildId:e8db9578fbb84b6267d28e3300a51e048bf04d6c 是动态库的唯一标识。
要还原报错方法的地址就要借助 llvm-addr2line 工具。这个工具一般在 /Users/username/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line 下面。 然后只要在命令行执行
/Users/username/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line -e /Users/username/Project/app/build/intermediates/merged_native_libs/Debug/out/lib/arm64-v8a/libtest.so 0x0000000000003edc 就会输出具体的方法地址。
我得到的是:
/Users/username/app/lib/src/main/cpp/Test.cpp:406
所以就是错误发生的代码是在Test.cpp文件的第406行。