當app出現線上奔潰,該如何辦?

來源:互聯網
上載者:User

標籤:邏輯   基本   導致   物理   事件   大小寫   作業系統   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出現線上奔潰,該如何辦?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.