標籤:邏輯 基本 導致 物理 事件 大小寫 作業系統 ios poi
1.如何追蹤app崩潰率,如何解決線上閃退
當iOS裝置上的App應用閃退時,作業系統會產生一個crash日誌,儲存在裝置上。crash日誌上有很多有用的資訊,比如每個正在執行線程的完整堆疊追蹤資訊和記憶體映像,這樣就能夠通過解析這些資訊進而定位crash發生時的代碼邏輯,從而找到App閃退的原因。通常來說,crash產生來源於兩種問題:違反iOS系統規則導致的crash和App代碼邏輯BUG導致的crash,下面分別對他們進行分析。
違反iOS系統規則產生crash的三種類型:
(1) 記憶體警示閃退
當iOS檢測到記憶體過低時,它的VM系統會發出低記憶體警告通知,嘗試回收一些記憶體;如果情況沒有得到足夠的改善,iOS會終止後台應用以回收更多記憶體;最後,如果記憶體還是不足,那麼正在啟動並執行應用可能會被終止掉。在Debug模式下,可以主動將用戶端執行的動作邏輯寫入一個log檔案中,這樣程式童鞋可以將記憶體預警的邏輯寫入該log檔案,當發生如下中的記憶體警示時,就是提醒當前用戶端效能記憶體吃緊,可以通過Instruments工具中的Allocations 和 Leaks模組庫來發現記憶體配置問題和記憶體流失問題。
(2) 響應逾時
當應用程式對一些特定的事件(比如啟動、掛起、恢複、結束)響應不及時,蘋果的Watchdog機制會把應用程式幹掉,並產生一份相應的crash日誌。這些事件與下列UIApplicationDelegate方法相對應,當遇到Watchdog日誌時,可以檢查中的幾個方法是否有比較重的阻塞UI的動作。
application:didFinishLaunchingWithOptions:applicationWillResignActive:applicationDidEnterBackground:applicationWillEnterForeground:applicationDidBecomeActive:applicationWillTerminate:
(3) 使用者強制退出
一看到“使用者強制退出”,首先可能想到的雙擊Home鍵,然後關閉應用程式。不過這種情境一般是不會產生crash日誌的,因為雙擊Home鍵後,所有的應用程式都處於後台狀態,而iOS隨時都有可能關閉後台進程,當應用阻塞介面並停止回應時這種情境才會產生crash日誌。這裡指的“使用者強制退出”情境,是稍微比較複雜點的操作:先按住電源鍵,直到出現“滑動關機”的介面時,再按住Home鍵,這時候當前應用程式會被終止掉,並且產生一份相應事件的crash日誌。
應用邏輯的Bug
大多數閃退崩潰日誌的產生都是因為應用中的Bug,這種Bug的錯誤種類有很多,比如:
SEGV:(Segmentation Violation,段違例),無效記憶體位址,比如null 指標,未初始化指標,棧溢出等;
SIGABRT:收到Abort訊號,可能自身調用abort()或者收到外部發送過來的訊號;
SIGBUS:匯流排錯誤。與SIGSEGV不同的是,SIGSEGV訪問的是無效地址(比如虛存映射不到實體記憶體),而SIGBUS訪問的是有效地址,但匯流排訪問異常(比如地址對齊問題);
SIGILL:嘗試執行非法的指令,可能不被識別或者沒有許可權;
SIGFPE:Floating Point Error,數學計算相關問題(可能不限於浮點計算),比如除零操作;
SIGPIPE:管道另一端沒有進程接手資料;
常見的崩潰原因基本都是代碼邏輯問題或資源問題,比如數組越界,訪問野指標或者資源不存在,或資源大小寫錯誤等。
crash的收集
如果是在windows上你可以通過itools或pp助手等協助工具輔助查看系統產生的曆史crash日誌,然後再根據app來查看。如果是在Mac 系統上,只需要開啟xcode->windows->devices,選擇device logs進行查看,如,這些crash檔案都可以匯出來,然後再單獨對這個crash檔案做處理分析。
看日誌
市場上已有的商業軟體提供crash收集服務,這些軟體基本都提供了日誌儲存,日誌符號化解析和服務端可視化管理等服務:
Crashlytics (www.crashlytics.com)
Crittercism (www.crittercism.com)
Bugsense (www.bugsense.com)
HockeyApp (www.hockeyapp.net)
Flurry(www.flurry.com)
開源的軟體也可以拿來收集crash日誌,比如Razor,QuincyKit(git連結)等,這些軟體收集crash的原理其實大同小異,都是根據系統產生的crash日誌進行了一次提取或封裝,然後將封裝後的crash檔案上傳到對應的服務端進行解析處理。很多商業軟體都採用了Plcrashreporter這個開源工具來上傳和解析crash,比如HockeyApp,Flurry和crittercism等。
crash資訊
由於自己的crash資訊太長,找了一張樣本:
1)crash標識是應用進程產生crash時的一些標識資訊,它描述了該crash的唯一標識(E838FEFB-ECF6-498C-8B35-D40F0F9FEAE4),所發生的硬體裝置類型(iphone3,1代表iphone4),以及App進程相關的資訊等;
2)基本資料描述的是crash發生的時間和系統版本;
3)異常類型描述的是crash發生時拋出的異常類型和錯誤碼;
4)線程回溯描述了crash發生時所有線程的回溯資訊,每個線程在每一幀對應的函數調用資訊(這裡由於空間限制沒有全部列出);
5)二進位映像是指crash發生時已載入的二進位檔案。以上就是一份crash日誌包含的所有資訊,接下來就需要根據這些資訊去解析定位導致crash發生的代碼邏輯, 這就需要用到符號化解析的過程(洋名叫:symbolication)。
解決線上閃退
首先保證,發布前充分測試。發布後依然有閃退現象,查看崩潰日誌,及時修複並發布。
當app出現線上奔潰,該如何辦?