分析ANR之iowait偏高

解決了一個anr的bug,在此記錄下;

我們首先看log 知道是哪個pid 發生的anr,再看trace文件,找到對應的,如下圖;

從圖我標出3塊紅色的地方:

1.第一個紅色,看似在等待信號量,其他不懂;

2.第二個紅色,應該是打開了strickmode 模式下進行的操作;

3.第三個紅色纔是自己的代碼調用,其實只是用log4j 打印了一條日誌,怎麼會anr呢?還有,3和2 應該沒有什麼關係,因爲log4j裏面沒有android 這塊的調用;2 應該是系統自動添加打印的;





這還不夠,然後仔細找log文件,發生ANR時,mmcqd 佔用cpu較多,查了下,這個是和sd卡讀取文件相關的進程;看來和日誌寫文件引發ANR符合;




再接着往下看,如下圖紅色,很關鍵,iowait 佔用有點偏高了,log4j 日誌寫文件正是io操作,也是耗時的操作;




暴力測試來確認:

1. 打日誌操作,循環執行1000次,不anr;1w次,確實發生了anr;


解決方案:

log4j 日誌寫文件不要放到主線程調用,另起子線程來執行;

再測試1w次,不會anr,而且打印日誌線程在非UI線程完成;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章