聲網崩潰數據的自動化閉環處理

語言: CN / TW / HK

01 崩潰信息的自動化處理是趨勢

程序崩潰是由於發生某種嚴重錯誤而導致程序無法繼續執行下去,從而異常退出的現象,它是質量保證過程中遇到最頻繁的問題之一,通常這類問題需要我們非常重視對待。當用户在使用你的 APP 遇到頻繁閃退或者崩潰時,會造成大量用户流失。

引起程序崩潰的原因有很多,通常是因為以下幾點:

1.程序邏輯問題,發生瞭如數組越界、堆棧溢出、空指針異常等問題;

2.設備兼容性問題,因為設備和系統的多樣性,特別是安卓系統,可能達到上千種,很難做到完全的設備兼容;

3.內存管理錯誤,程序內部存在內存泄漏問題,長時間的運行和無法釋放對象的累積,導致了內存溢出,最終發生程序崩潰;或者是程序所需要的運行內存超過了設備限制等。

現實生產過程中,因為多種版本的迭代,可能會讓我們面對海量的崩潰數據,需要對每一條數據逐個的去進行人工校驗,篩選出重複問題,保留有效數據,並且提交 BUG 進行跟蹤。不僅費時費力,效率低下,還很有可能會引發嚴重問題的疏漏。所以建立一條便捷高效的自動化的閉環處理流程十分必要。

02 常見解決方案的不足

以往常見的解決方案是集成騰訊的 Bugly SDK, 用來捕獲 Android 或者 iOS APP 中的崩潰信息。Bugly 提供了一套完整的崩潰信息監控和解決方案。開發者將移動應用集成 Bugly,然後通過崩潰監控後台服務,可以方便的展示出用户在使用 APP 過程中出現的崩潰/ANR 等問題,並根據上報的崩潰信息快速定位和解決問題。但是這種方案並不能應用在桌面應用上(Windows/Mac 等),而且 Bugly 目前也沒有開放第三方接口,讓我們獲取崩潰數據列表以便於進行自動化分析處理。崩潰信息都要人工去進行處理過濾,最終達到的效果並不能讓人滿意。

03 跨平台的崩潰自動化閉環處理方案

為了解決上述問題,Agora 開發了一套跨平台(Android/iOS/Mac/Windows)的崩潰信息採集處理方案。當發生崩潰的時候,Agora 的 SDK 會將相關信息(版本號、平台、編譯號、崩潰偏移地址、符號表地址、DMP 文件鏈接等)提交到我們的後台系統,後台通過綁定的堆棧信息和符號表進行符號化,提取出地址和符號的對應關係,進而還原成開發人員可以理解的崩潰堆棧信息。

符號化完成之後,系統會判斷當前的 SDK 版本是不是已經提交了相同問題的 JIRA,如果沒有提交,就新增 JIRA。在新增 JIRA 的過程中還可以根據崩潰的模塊指派到對應的負責人,比如最終定位到是 audio 模塊的崩潰,就指定到 audio 模塊開發負責人,video 模塊的崩潰,就指定到 video 模塊的負責人,網絡模塊的崩潰,就指定到網絡模塊的負責人,優化了手動指派負責人的過程、大大提升了問題處理的效率。如果當前分析的結果是已經提交過 JIRA,則自動關聯到相關的問題上並更新對應問題的崩潰次數。整個處理的流程如下圖所示:

怎麼區分一個版本相同的問題是否提交過呢?目前有兩個維度,一個是通過編譯號和崩潰偏移地址確認,如果多個崩潰數據的編譯號和崩潰偏移地址是一致的,那麼我們就將這幾個崩潰數據歸類為同一個問題,提交 JIRA 的時候會彙總同一個問題產生的次數。但是經過一段時間的實踐,我們發現很多情況下同一個版本的編譯號和崩潰偏移地址不一致,但有可能是由於同一個問題導致的。所以我們需要引入第二個維度,提取出堆棧詳情進行分析。我們把能夠解析出來的行的信息拼接起來,得到拼接字符串 Hash 值,然後根據 Hash 值是否相同去進行判斷,同樣的問題是否已經有過提交記錄。通過兩個維度的篩選,可以有效的去除重複問題的 JIRA 提交,並且可以更有效的進行崩潰數量的統計。其中我們可以制定一些不同的 Hash 生成方案來進行重複崩潰問題的過濾,可以通過最為寬鬆的方案,如通過最終崩潰的類名+方法名來生成 Hash;嚴格的方案如根據最終崩潰的文件名+模塊名+類名+方法名+參數名來生成 Hash。下圖是我們實踐過程中,通過自動化解析崩潰數據提交的一個 JIRA:

JIRA 中包含了當前的版本號、編譯號、崩潰偏移地址、統計的崩潰次數、系統信息等。分析過程中還提取了崩潰堆棧中的關鍵信息,放在 JIRA 描述中,可以方便的讓開發人員定位相關問題。通過這種有效的篩選分析,我們可以把一個版本上萬個崩潰數據彙總進幾十個 JIRA 裏面, 大大提升了崩潰問題的處理效率。

04 崩潰數據統計

平台化地管理當前發生的崩潰問題,可以讓開發/測試/項目管理者更方便地根據平台、版本號、JIRA 狀態等信息來查找統計相關問題:

我們還可以根據Hash彙總,快速地查看到在哪些版本發生了相同的問題、發生的頻率如何,在以後的開發過程中可以進行更好的規避:

同時還可以定時記錄每日的崩潰數據,獲取崩潰增量最高且未解決的 JIRA 進行每日崩潰 Top10 告警,提醒相關開發人員跟進最高優先級的問題:

通過我們的自動化實踐,提升了問題解決的效率,減少了任務堆積和研發成本,在不斷提升代碼質量的同時加速了版本迭代的速度,客觀上不斷提升了用户體驗,為公司業務的發展不斷添磚加瓦。

Dev for Dev專欄介紹

Dev for Dev(Developer for Developer)是聲網Agora 與 RTC 開發者社區共同發起的開發者互動創新實踐活動。透過工程師視角的技術分享、交流碰撞、項目共建等多種形式,匯聚開發者的力量,挖掘和傳遞最具價值的技術內容和項目,全面釋放技術的創造力。