android dropbox anr分析,Android如何分析排查ANR

釋放雙眼,帶上耳機,聽聽看~!

在Android開發中,當程序發生異常時會拋出異常信息,先說下三種常見類型:

列表內容KeyDispatchTimeout(谷歌default 5s,MTK平臺上是8s) –主要類型

按鍵或觸摸事件在特定時間內無響應

BroadcastTimeout(10s)

BroadcastReceiver在特定時間內無法處理完成

ServiceTimeout(20s) –小概率類型

Service在特定的時間內無法處理完成

一些典型的ANR 問題場景

1)最常見錯誤,UI線程等待其它線程釋放某個鎖,導致UI線程無法處理用戶輸入;

2)游戲中每幀動畫都進行了比較耗時的大量計算,導致CPU忙不過來;

3)Web應用中,網絡狀態不穩定,而界面在等待網絡數據;

4)UI線程中進行了一些磁盤IO(包括數據庫、SD卡等等)的操作,在個別設備上因為硬件損壞等原因阻塞住了;

5)手機被其他App占用著CPU,自己獲取不到足夠的CPU 時間片,純屬誤傷。

排查分析的思路:

1、通過ANR 日志定位問題

當ANR發生時,我們往往通過Logcat和traces文件(目錄/data/anr/)的相關信息輸出去定位問題。主要包含以下幾方面:

1)基本信息,包括進程名、進程號、包名、系統build號、ANR 類型等等;

2)CPU使用信息,包括活躍進程的CPU 平均占用率、IO情況等等;

3)線程堆棧信息,所屬進程包括發生ANR的進程、其父進程、最近有活動的3個進程等等。

1.1首先通過Log來獲取異常信息

android系統會自動幫我們生成一個log日志輸出文件,在data/system/dropbox/下,真機測試需要root權限,模擬器在DDMS下可以查看。

用這種方法,出現問題,根本不需要斷點調試 , 直接定位到問題,屢試不爽 。

從LOG可以看出ANR的類型,CPU的使用情況,

一般在如下幾種情況會產生log 。

1,程序異常退出 , uncaused exception

2,程序強制關閉 ,Force Closed (簡稱FC)

3,程序無響應 , Application No Response (簡稱ANR) , 順便,一般主線程超過5秒么有處理就會ANR

步驟:

1.打開log文件 , 由于是ANR錯誤,因此搜索”ANR ” , 為何要加空格呢,你加上和去掉比較一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的無效信息

定位到關鍵的事件信息如下:

01-15 16:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms (com.android.mms/.ui.SlideshowActivity)

01-15 16:49:02.433 E/ActivityManager( 2466): Reason: keyDispatchingTimedOut

01-15 16:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42

01-15 16:49:02.433 E/ActivityManager( 2466): CPU usage from 1337225ms to 57ms ago:

01-15 16:49:02.433 E/ActivityManager( 2466): sensorserver_ya: 8% = 0% user + 8% kernel / faults: 40 minor

......

01-15 16:49:02.433 E/ActivityManager( 2466): -com.android.mms: 0% = 0% user + 0% kernel

01-15 16:49:02.433 E/ActivityManager( 2466): -flush-179:8: 0% = 0% user + 0% kernel

01-15 16:49:02.433 E/ActivityManager( 2466): TOTAL: 25% = 10% user + 14% kernel + 0% iowait + 0% irq + 0% softirq

01-15 16:49:02.436 I/ ( 2466): dumpmesg > "/data/log/dumpstate_app_anr.log"

我們用自然語言來描述一下日志,

01-15 16:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms (com.android.mms/.ui.SlideshowActivity)

翻譯:在16:49分2秒433毫秒的時候 ActivityManager (進程號為2466) 發生了如下錯誤:com.android.mms包下面的.ui.SlideshowActivity 無響應 。

01-15 16:49:02.433 E/ActivityManager( 2466): Reason: keyDispatchingTimedOut

翻譯:原因 , keyDispatchingTimeOut – 按鍵分配超時

01-15 16:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42

翻譯:5分鐘,10分鐘,15分鐘內的平均負載分別為:0.6 , 0.61 , 0.42

我們大概知道問題是什么了,問題是在點擊按鈕某時候可能處理不過來按鈕事件,導致超時無響應 。但我們不能準確的知道到底問題在哪兒 , 只是猜測 ,比如這個應用程序中,多個IO操作的地方都在主線程中,可能引起問題,但不好判斷到底是哪個 ,所以我們目前掌握的信息還不夠 。

于是我們再分析虛擬機信息 ,搜索“Dalvik Thread”關鍵詞,快速定位到本應用程序的虛擬機信息日志

1.2通過分析trace文件得到ANR信息(真機導出,模擬機在DDMS下查看)

如果ANR發生,對應的應用會收到SIGQUIT異常終止信號,dalvik虛擬機就會自動在/data/anr/目錄下生成trace.txt文件,將異常信息寫入到traces文件中,系統會記錄異常的位置、CPU和內存當時的使用情況,通過查看日志基本就能判斷問題所在。

接下來用adb shell命令導出該文件,通過shell命令就可以了。

adb pull /data/anr/traces.txt d:/ =》意思是將手機上的traces.txt導出到電腦的d目錄下

或者

1、adb shell

2、cat /data/anr/xxx >/mnt/sdcard/yy/zz.txt

3、exit

4、adb pull /mnt/sdcard/yy/zz.txt d: ,即可將文件導出到了d盤。

在發生ANR時,

步驟:

1. 找到ANR關鍵字(大寫匹配)

2. 向上查找timeout關鍵字,這個時候能找到ANR的原因,如: Application do too much work in main thread 等。

3. 查看trace 文件找出出現的最終原因。

測試過程發現ANR的現狀

1、在平常測試中,ANR基本測試不到,因為ANR基本發生在垃圾設備中,弱網絡,頻繁操作。

2、問題不必現,即使看到了問題,定位麻煩:要去data/anr.txt 文件里面查找。必須root,沒有對應關系,分析復雜,導出文件就必須依賴手機零距離。

由于anr問題不必現,因此引入以下ANR檢測工具,當anr問題出現時,自動dump手機中的日志信息如trace文件、堆棧信息

基本原理

檢測到UI主線程卡頓時間超過設定的時間,如4s,即dump trace文件以及堆棧信息,同時拋出異常,收集信息,根據這些文件信息即可定位到發生anr的原因

1.3在源代碼中插入ANR檢測工具(BlockCanary、StrictMode)

1.4使用第三方SDK輸出Crach信息到后臺服務器:

如騰訊bugly 和umeng

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372018.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372018.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372018.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改httpd默認端口號

Tomcat: vim /etc/httpd/conf/httpd.conf//別忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 轉載于:https://www.cnblogs.com/bincoding/p/6067054.html

整合彈簧,速度和瓷磚

我喜歡 Tiles, 并且聽到了很多有關 Velocity的信息 。 它們似乎有不同的用途,并且據說很容易結合在一起,所以我決定試一試,并在Spring Web應用程序中同時使用它們。 集成實際上花費了許多小時,并且是一次真正的過山車&…

Android 軟鍵盤自動彈出和關閉

在我們寫修改信息或者搜索,修改密碼等界面的時候,用戶進入這個界面的主要目的就是輸入修改/查找 某些信息,為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出。 1.軟鍵盤的自動彈出 private void showKeyboard(){InputMethodM…

android adb殺死服務,Android app是如何殺掉的

1. adb shell kill -9 pid_of_appAMS定義了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里會注冊 App 進程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);當App進…

iOS學習筆記39-ReactiveCocoa入門

FRP,全稱為Functional Reactive Programming,是一種響應變化的編程范式,最近幾年比較火,大概的理解就像這樣: 當a的值或者b的值發生變化時,c的值會自動響應a的值或b的值變化的信號,自動更正自己…

使用密碼摘要生成器擴展JMeter

最近,我不得不處理一個帶有50,000條用戶記錄的OpenLDAP實例,并進行一些壓力測試。 JMeter是填充LDAP的最佳選擇。 但是,在我的情況下,OpenLDAP配置為不接受任何明文密碼。 因此,我無法使用通過JMeter LDAP Request采…

制造業數字化轉型核心不止是技術

一、制造業的數字化轉型意味著什么? 在當今的制造業領域,數字化轉型意味著通過集成數字技術來增強傳統的制造方法、產品和勞動力的過程。這些技術包括一系列創新,如自動化軟件、電子商務系統、傳感器、工業機器人等。 二、制造業數字化轉型的…

分類測試以減少構建時間

在繼續本文的主要內容之前,讓我們先進行一些定義。 單元測試 單元測試是小型的(測試一種用例或單元),在內存中運行(不與數據庫,消息隊列等交互),可重復且快速的測試。 對于我們的對…

android橫向展示狀態,【報Bug】Android橫屏狀態下啟動App,即使在App.vue中鎖定豎屏,但是首頁nvue中的rpx單位是按照啟動的橫豎屏狀態顯示的!...

詳細問題描述(DCloud產品不會有明顯的bug,所以你遇到的問題大都是在特定環境下才能重現的問題,請仔細描述你的環境和重現方式,否則DCloud很難排查解決你的問題)[內容]重現步驟[步驟][結果][期望]nvue首頁rpx單位能夠根據App.vue鎖定的屏幕方向…

property修飾關鍵字

修飾符按作用區分:線程安全相關,內存相關,讀寫權限相關,set和get,是否可為空, class 一.默認值 property NSArray *dataArray; 默認的是:atomic,strong(有的文章寫的居然是assign,我認為還是str…

高精度相關模板.

1 2 /*3 高精度加法.4 */5 #include<cstring>6 #include<cstdio>7 #include<iostream>8 #define MAXN 100019 using namespace std;10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;11 char m[MAXN],n[MAXN];12 void slove()13 {14 l3max(l1,l2);15 for(in…

5分鐘內Google App Engine上的Vaadin App

在本教程中&#xff0c;您將學習如何創建第一個Vaadin Web應用程序&#xff0c;如何在本地AppEngine開發服務器上運行它以及如何將其部署到Google App Engine基礎結構。 所有這些大約需要5到10分鐘。 是的&#xff0c;如果您安裝了必要的先決條件&#xff0c;則可以立即開始運行…

linux系統調用的封裝格式,ARM Linux系統調用的原理

ARM Linux系統調用的原理ARM Linux系統調用的原理操作系統為在用戶態運行的進程與硬件設備進行交互提供了一組接口。在應用程序和硬件之間設置一個額外層具有很多優點。首先&#xff0c;這使得編程更加容易&#xff0c;把用戶從學習硬件設備的低級編程特性中解放出來。其次&…

(延遲兩秒,跳轉相應頁面)(返回到上一個頁面并刷新)

1.setTimeout("window.location.href /moment/reason",2000);2.返回到上一個頁面并刷新 self.location document.referrer;2.1常見的幾種刷新方式 a.history.go(-1) 返回上一頁 b.location.reload() 刷新當前頁面 c.history.back() 返回上一頁2.2當…

檢索字符創 php

strstr()可以返回匹配的值 echo strstr("localhost", "os");返回ost echo substr_count("gggggs", "g"); 返回檢索匹配字符創次數 substr_replace 字串替換函數轉載于:https://www.cnblogs.com/lidepeng/p/6078064.html

android8強制將app移到sd卡,小內存手機?APP強制轉移至SD卡教程

雖然近兩年手機的機身內存越做越大&#xff0c;但是身邊總還是有些朋友在使用幾年前的手機。而面對如今海量的豐富應用&#xff0c;早年的手機中內置的存儲空間已經開始捉襟見肘。雖說對于這類機型系統通常都提供了將APP轉移至外置內存卡的功能&#xff0c;可是依然有一些頑固的…

在沒有XML的情況下測試Spring和Hibernate

我非常熱衷于Spring 3中的改進&#xff0c;這些改進最終使您能夠在IDE和編譯器的適當支持下從XML遷移到純Java配置。 它并沒有改變Spring是一個龐大的套件這一事實&#xff0c;并且有時發現您需要的東西可能需要一段時間。 圍繞Hibernate的無XML單元測試就是這樣一回事。 我知道…

Observer觀察者設計模式

Observer設計模式主要包括以下兩種對象: (1)被觀察對象:Subject,它往往包含其他對象感興趣的東西,上面例子中熱水器中就是Subject(被監視對象); (2)觀察對象:Observer,它觀察著Subject,當Subject中的某件事發生后,會告知Observer,Obersver會采取相應的行動。上面例子中顯示器和…

最小生成樹 prime zoj1586

題意&#xff1a;在n個星球&#xff0c;每2個星球之間的聯通需要依靠一個網絡適配器&#xff0c;每個星球喜歡的網絡適配器的價錢不同&#xff0c;先給你一個n&#xff0c;然后n個數&#xff0c;代表第i個星球喜愛的網絡適配器的價錢&#xff0c;然后給出一個矩陣M[i][j]代表第…

android 書架菜單,Android入門3--做一個書架

修改名稱創建項目的時候&#xff0c;APP的名字取為英文或者拼音&#xff0c;是為了簡便&#xff0c;但是顯示在界面上&#xff0c;我們當然希望它是中文的。taoguanstring>我們要做的很簡單&#xff0c;就是在string.xml中&#xff0c;將app_name的內容修改為我們希望的名字…