Native进程之Trace原理

一. 概述

当发生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命令后:

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]

debuggerd/backtrace.cpp]" title=" dump_backtrace [-> debuggerd/backtrace.cpp]">

2.2 dump_process_header

[-> debuggerd/backtrace.cpp]

debuggerd/backtrace.cpp]" title="dump_process_header [-> debuggerd/backtrace.cpp]">

例如:

debuggerd/backtrace.cpp]" title="dump_process_header [-> debuggerd/backtrace.cpp]">

2.3 dump_thread

[-> debuggerd/backtrace.cpp]

debuggerd/backtrace.cpp]" title="dump_thread [-> debuggerd/backtrace.cpp]">

2.4 dump_backtrace_to_log

[-> debuggerd/Backtrace.cpp]

debuggerd/Backtrace.cpp]" title=" dump_backtrace_to_log [-> debuggerd/Backtrace.cpp]">

通过循环遍历输出整个backtrace中的原理每一栈帧FormatFrameData的信息.

2.5 FormatFrameData

[-> debuggerd/Backtrace.cpp]

debuggerd/Backtrace.cpp]" title=" FormatFrameData [-> debuggerd/Backtrace.cpp]">

例如:(这些map信息是由/proc/%d/maps解析出来的)

#01 pc 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而来的。

【本文是进程专栏“小米开放平台”原创文章,“小米开放平台”微信公众号xiaomideveloper】

戳这里,原理看该作者更多好文

进程云南idc服务商
IT科技
上一篇:什么是im域名?新手需要了解im域名哪些?
下一篇:为什么现在中文域名觉得好?使用中文域名有什么好处?