android NDK 报错日志解读和还原报错方法名

发布于:2025-08-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

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行。


网站公告

今日签到

点亮在社区的每一天
去签到