我有使用 Android NDK 工具链编译的本机源代码。此共享库由运行在 android 设备上的 mediaserver 进程加载。通常当任何用户空间进程崩溃时,android 中的调试器守护进程会获取崩溃进程的堆栈跟踪并将其打印在 logcat 消息中。但有时,我看到 mediaserver 进程崩溃,logcat 日志中没有堆栈跟踪,但内核日志打印出堆栈跟踪,表明 mediaserver 进程中存在页面错误。它打印出 PC、LR 和其他寄存器。那么如何解码这些信息以定位错误代码中的地址呢?
这是一个示例跟踪:
<7>[ 198.755417] mediaserver: unhandled page fault (11) at 0x7b969000, code 0x817
<1>[ 198.755424] pgd = e005c000
<1>[ 198.757092] [7b969000] *pgd=25865831, *pte=00000000, *ppte=00000000
<4>[ 198.764864] Pid: 1957, comm: mediaserver
<4>[ 198.769647] CPU: 2 Tainted: G W (3.4.0-gf77558a-00009-gb024756 #2)
<4>[ 198.777010] PC is at 0x40082728
<4>[ 198.780007] LR is at 0x408
<4>[ 198.782702] pc : [<40082728>] lr : [<00000408>] psr: 20000010
<4>[ 198.782703] sp : 75393dd0 ip : 00001ba0 fp : 00000002
<4>[ 198.794310] r10: 483463c0 r9 : 00000000 r8 : 00001200
<4>[ 198.799373] r7 : 6afdf950 r6 : 6aff0db8 r5 : 412ef814 r4 : 7b68c008
<4>[ 198.806293] r3 : ff1b1517 r2 : 0034bc00 r1 : 48346000 r0 : 7b968fe8
<4>[ 198.812546] Flags: nzCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
<4>[ 198.819848] Control: 10c5787d Table: 2805c06a DAC: 00000015
<4>[ 198.825432]
<4>[ 198.825433] R3: 0xff1b1497:
<4>[ 198.829572] 1494 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.837734] 14b4 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.845893] 14d4 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.854070] 14f4 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.862211] 1514 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.870371] 1534 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.878532] 1554 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.886693] 1574 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.894851] 1594 ******** ******** ******** ******** ******** ******** ******** ********
<4>[ 198.903028] [<c0013da4>] (unwind_backtrace+0x0/0x11c) from [<c0019980>] (__do_user_fault+0x110/0x15c)
<4>[ 198.912347] [<c0019980>] (__do_user_fault+0x110/0x15c) from [<c0786384>] (do_page_fault+0x380/0x3d0)
<4>[ 198.921358] [<c0786384>] (do_page_fault+0x380/0x3d0) from [<c0008514>] (do_DataAbort+0x134/0x1a8)
<4>[ 198.930251] [<c0008514>] (do_DataAbort+0x134/0x1a8) from [<c0784bb4>] (__dabt_usr+0x34/0x40)
<4>[ 198.938631] Exception stack(0xddd8bfb0 to 0xddd8bff8)
<4>[ 198.943658] bfa0: 7b968fe8 48346000 0034bc00
ff1b1517
<4>[ 198.951801] bfc0: 7b68c008 412ef814 6aff0db8 6afdf950 00001200 00000000 483463c0 00000002
<4>[ 198.960035] bfe0: 00001ba0 75393dd0 00000408 40082728 20000010 ffffffff