一、崩溃转储
参考android官网:
https://developer.android.google.cn/ndk/guides/ndk-stack?hl=zh-cn
https://source.android.google.cn/devices/tech/debug
https://source.android.google.cn/devices/tech/debug/native-crash#crashdump
当动态链接的可执行文件启动时,系统会注册多个信号处理程序,这些处理程序会在出现崩溃时将基本崩溃转储写入 logcat
,并将更详细的“tombstone”
文件写入 /data/tombstones/
。 tombstone
是一个包含与崩溃进程相关的额外数据的文件。需要特别指出的是,它包含对以下内容进行的堆栈跟踪:崩溃进程中的所有线程(而不只是捕捉到信号的线程)、完整的内存映射,以及所有打开的文件描述符的列表。
在 Android 8.0 之前,崩溃由 debuggerd
和 debuggerd64
守护进程处理。在 Android O 和更高版本中,crash_dump32
和 crash_dump64
是根据需要生成的。
您可由此得知 debuggerd
写入额外信息的位置。 debuggerd
会保留最多 10
个 tombstone
,从编号 00
至 09
循环并根据需要覆盖现有 tombstone
。
Tombstone
包含与崩溃转储相同的信息,还包含一些其他信息。例如,它包含所有线程(不仅仅是崩溃线程)的回溯、浮点寄存器、原始堆栈转储,以及寄存器中地址附近的内存转储。
崩溃转储程序仅在未连接任何其他内容时才可连接。这意味着,在使用 strace 或 gdb 等工具时,将无法进行崩溃转储。
输出示例(已去除时间戳和无关信息):
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Android/aosp_angler/angler:7.1.1/NYC/enh12211018:eng/test-keys'
Revision: '0'
ABI: 'arm'
pid: 17946, tid: 17949, name: crasher >>> crasher <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
r0 0000000c r1 00000000 r2 00000000 r3 00000000
r4 00000000 r5 0000000c r6 eccdd920 r7 00000078
r8 0000461a r9 ffc78c19 sl ab209441 fp fffff924
ip ed01b834 sp eccdd800 lr ecfa9a1f pc ecfd693e cpsr 600e0030
backtrace:
#00 pc 0004793e /system/lib/libc.so (pthread_mutex_lock+1)
#01 pc 0001aa1b /system/lib/libc.so (readdir+10)
#02 pc 00001b91 /system/xbin/crasher (readdir_null+20)
#03 pc 0000184b /system/xbin/crasher (do_action+978)
#04 pc 00001459 /system/xbin/crasher (thread_callback+24)
#05 pc 00047317 /system/lib/libc.so (_ZL15__pthread_s