专栏名称: 51CTO
51CTO官方公众号——聚焦最新最前沿最有料的IT技术资讯、IT行业精华内容、产品交流心得。本订阅号为大家提供各种技术干货,还会不定期的举办有奖活动,敬请关注。
目录
相关文章推荐
新浪科技  ·  【#小米成立AI平台部#,任命张铎为AI平台 ... ·  3 天前  
新浪科技  ·  【#美国43只在逃实验猴捉回一只# ... ·  1 周前  
51好读  ›  专栏  ›  51CTO

干货 | Native进程之Trace原理

51CTO  · 公众号  · 科技媒体  · 2017-02-09 11:49

正文


作者

袁辉辉    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的工作原理,此处当执行debuggerd -b命令后:

  1. Client进程调用send_request()方法向debuggerd服务端发出DEBUGGER_ACTION_DUMP_BACKTRACE命令;

  2. Debugggerd进程收到该命令,fork子进程中再执行worker_process()过程;

  3. 子进程通过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(函数名+偏移量)
#01pc 000000000001cca4/system/lib64/libc.so(epoll_pwait+32)


2.6 dump_process_footer


[-> debuggerd/backtrace.cpp]


static void dump_process_footer(log_t* log, pid_t pid) {
  _LOG(log, logtype::BACKTRACE, "\n----- end %d -----\n", pid);
}

例如:----- end 1789 -----


总结

通过debuggerd -b [pid],可输出Native进程的调用栈,这些信息是通过解析/proc/[pid]/maps而来的。




想了解更多

那就快来关注我们

长按二维码关注开放小助理