Native進程之Trace原理spa
做者介紹:
袁輝輝
MIUI系統工程師pwa
一. 概述
當發生ANR(Application Not Response),對於Java進程可經過kill -3向目標進程發送信號SIGNAL_QUIT, 輸出相應的traces信息保存到目錄/data/anr/traces.txt;而對於Native進程可經過 debuggerd輸出traces信息。debug
可經過一條命令來獲取指定Native進程的traces信息,例如輸出pid=17529進程信息:code
執行完該命令後直接輸出traces信息到屏幕,以下:orm
接下來講說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.ip
接下來,從dump_backtrace()方法講起:ci
2.1 dump_backtrace
[-> debuggerd/backtrace.cpp]get
2.2 dump_process_header
[-> debuggerd/backtrace.cpp]it
例如:
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)
例如:----- end 1789 -----
三. 總結
經過debuggerd -b [pid],可輸出Native進程的調用棧,這些信息是經過解析/proc/[pid]/maps而來的。
小米開放平臺官方連接:
http://dev.xiaomi.com/?hmsr=s...
官方QQ交流羣:398616987
想要了解更多?
那就關注咱們吧!