掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一. 概述

當(dāng)發(fā)生ANR(Application Not Response),對(duì)于Java進(jìn)程可通過kill -3向目標(biāo)進(jìn)程發(fā)送信號(hào)SIGNAL_QUIT, 輸出相應(yīng)的traces信息保存到目錄/data/anr/traces.txt;而對(duì)于Native進(jìn)程可通過 debuggerd輸出traces信息。
可通過一條命令來獲取指定Native進(jìn)程的traces信息,例如輸出pid=17529進(jìn)程信息:
執(zhí)行完該命令后直接輸出traces信息到屏幕,如下:
接下來說說debuggerd是如何輸出Native進(jìn)程的trace。
二. Debuggerd
文章debuggerd守護(hù)進(jìn)程詳細(xì)介紹了Debuggerd的工作原理,此處當(dāng)執(zhí)行debuggerd -b命令后:
接下來,從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]
通過循環(huán)遍歷輸出整個(gè)backtrace中的每一棧幀F(xiàn)ormatFrameData的信息.
2.5 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 -----
三. 總結(jié)
通過debuggerd -b [pid],可輸出Native進(jìn)程的調(diào)用棧,這些信息是通過解析/proc/[pid]/maps而來的。
【本文是專欄“小米開放平臺(tái)”原創(chuàng)文章,“小米開放平臺(tái)”微信公眾號(hào)xiaomideveloper】

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流