Native進程之Trace原理

Native進程之Trace原理

做者:袁輝輝spa

一. 概述pwa

當發生ANR(Application Not Response),對於Java進程可經過kill -3向目標進程發送信號SIGNAL_QUIT, 輸出相應的traces信息保存到目錄/data/anr/traces.txt;而對於Native進程可經過 debuggerd輸出traces信息。debug

可經過一條命令來獲取指定Native進程的traces信息,例如輸出pid=17529進程信息:orm

經過一條命令來獲取指定Native進程的traces信息

執行完該命令後直接輸出traces信息到屏幕,以下:blog

經過一條命令來獲取指定Native進程的traces信息

接下來講說debuggerd是如何輸出Native進程的trace。進程

二. Debuggerdci

文章debuggerd守護進程詳細介紹了Debuggerd的工做原理,此處當執行debuggerd -b命令後:get

1.Client進程調用send_request()方法向debuggerd服務端發出DEBUGGER_ACTION_DUMP_BACKTRACE命令;it

2.Debugggerd進程收到該命令,fork子進程中再執行worker_process()過程io

3.子進程經過perform_dump()方法來根據命令DEBUGGER_ACTION_DUMP_BACKTRACE,會調用到dump_backtrace()方法輸出backtrace.

接下來,從dump_backtrace()方法講起:

2.1 dump_backtrace

[-> debuggerd/backtrace.cpp]

 dump_backtrace [-> debuggerd/backtrace.cpp]

2.2 dump_process_header

[-> debuggerd/backtrace.cpp]

dump_process_header  [-> debuggerd/backtrace.cpp]

例如:

dump_process_header  [-> debuggerd/backtrace.cpp]

2.3 dump_thread

[-> debuggerd/backtrace.cpp]

dump_thread  [-> debuggerd/backtrace.cpp]

2.4 dump_backtrace_to_log

[-> debuggerd/Backtrace.cpp]

 dump_backtrace_to_log  [-> debuggerd/Backtrace.cpp]

經過循環遍歷輸出整個backtrace中的每一棧幀FormatFrameData的信息.

2.5 FormatFrameData

[-> debuggerd/Backtrace.cpp]

 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而來的。

小米開放平臺官方地址:

http://dev.xiaomi.com?hmsr=%E5%BC%80%E6%BA%90%E4%B8%AD%E5%9B%BD%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93&hmpl=&hmcu=&hmkw=&hmci=

小米開放平臺官方交流羣:398616987

想了解更多?

那就趕忙來關注咱們

小米開放平臺公衆號

相關文章
相關標籤/搜索