一、概述当ANR(ApplicationNotResponse)发生时,Java进程可以通过kill-3向目标进程发送信号SIGNAL_QUIT,并输出相应的traces信息到目录/data/anr/痕迹。TXT;而对于Native进程,可以通过debuggerd输出traces信息。可以使用一条命令获取指定Native进程的traces信息,例如outputpid=17529进程信息:执行该命令后,将traces信息直接输出到屏幕上,如下:接下来说说debuggerd是如何实现的输出本机进程的踪迹。2.Debuggerd篇debuggerd守护进程详细介绍了Debuggerd的工作原理。这里,执行完debuggerd-b命令后:Client进程调用send_request()方法向debuggerd服务器发送DEBUGGER_ACTION_DUMP_BACKTRACE命令;Debuggerd进程收到命令,fork子进程,然后执行worker_process()进程;子进程会根据命令DEBUGGER_ACTION_DUMP_BACKTRACE调用dump_backtrace()方法通过perform_dump()方法输出backtrace。接下来开始dump_backtrace()方法:2.1dump_backtrace[->debuggerd/backtrace.cpp]2.2dump_process_header[->debuggerd/backtrace.cpp]例如:2.3dump_thread[->debuggerd/backtrace.cpp]2.4dump_backtrace_to_log[->debuggerd/Backtrace.cpp]循环输出整个backtrace中的每个栈帧FormatFrameData2.5FormatFrameData[->debuggerd/Backtrace.cpp]例如:(这些map信息由/proc/%d/maps解析)#01pc000000000001cca4/system/lib64/libc.so(epoll_pwait+32)2.6dump_process_footer[->debuggerd/backtrace.cpp]staticvoiddump_process_footer(log_t*log,pid_tpid){_LOG(log,logtype::BACKTRACE,"\n-----end%d-----\n",pid);}例如:-----end1789-----3.总结通过debuggerd-b[pid],可以输出Native进程的调用栈,通过/proc解析信息来自/[pid]/maps【本文为“小米开放平台”专栏原创文章,“小米开放平台”微信公众号xiaomideveloper】点此查看本作者更多好文
