作者
袁辉辉
MIUI系统工程师
从事Android framework相关工作
网络ID: Gityuan
当发生ANR(Application Not Response),对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/data/anr/traces.txt;而对于Native进程可通过 debuggerd输出traces信息。
可通过一条命令来获取指定Native进程的traces信息,例如输出pid=17529进程信息:
执行完该命令后直接输出traces信息到屏幕,如下:
接下来说说debuggerd是如何输出Native进程的trace。
文章
debuggerd守护进程
详细介绍了Debuggerd的工作原理,此处当执行debuggerd -b命令后:
-
Client进程调用send_request()方法向debuggerd服务端发出DEBUGGER_ACTION_DUMP_BACKTRACE命令;
-
Debugggerd进程收到该命令,fork子进程中再执行worker_process()过程;
-
子进程通过perform_dump()方法来根据命令DEBUGGER_ACTION_DUMP_BACKTRACE,会调用到dump_backtrace()方法输出backtrace.
接下来,从dump_backtrace()方法讲起:
2.1 dump_backtrace
[-> debuggerd/backtrace.cpp]
2.2 dump_process_header
[-> debuggerd/backtrace.cpp]
例如:
2.3 dump_thread
[-> debuggerd/backtrace.cpp]
2.4 dump_backtrace_to_log
[-> debuggerd/Backtrace.cpp]
通过循环遍历输出整个backtrace中的每一栈帧FormatFrameData的信息.
2.5 FormatFrameData
[-> debuggerd/Backtrace.cpp]
例如:(这些map信息是由/proc/%d/maps解析出来的)
#01 pc 000000000001cca4 /system/lib64/libc.so (epoll_pwait+32)
帧号
|
pc指针
|
map_name
|
(函数名+偏移量)
|
#01
|
pc 000000000001cca4
|
/system/lib64/libc.so
|
(epoll_pwait+32)
|