Dumb Game Lab

部落格 · 開發幕後

獨立開發失誤紀錄

為了測試當機回報,我故意讓 App 當機,它卻沒當機

Justin Lee, Dumb Game Lab ·

奇奇背包的戰鬥畫面。雨傘和筆電等隨身物品依格子塞進背包,下方是技能卡

我在好幾款遊戲裡裝了當機收集器,App 一出事手機就會馬上通知我,結果第一週判斷錯了兩次。故意讓 App 當機的開關在 iPhone 實機上沒能讓 App 當機,而 Play 上架後立刻收到的兩筆啟動錯誤,也不是使用者遇到的,而是 Google 發布前測試機器出的。兩次都是測試的那一方出了錯。

要測試收集器,App 必須真的當機

遊戲在手機上出問題時,我希望自己比評論更早知道。所以我做了一個蒐集錯誤的小工具,裝進大約十款遊戲。它會接收 WebView 錯誤、出錯前最後一個操作,以及整個 App 直接消失的原生當機。

難的是測試。要確認收集器抓不抓得到當機,App 就得真的當機。所以我另外加了一個故意讓 App 當機的開關。按下藏起來的按鈕,就會對 App 的處理程序送出 SIGSEGV(記憶體存取錯誤的訊號)。

誤判一:我以為送出訊號 App 就會死

我在 iPhone 11 Pro 實機上按了開關,App 沒有死。畫面原封不動,收集器也什麼都沒收到。

這時最危險的結論,是認定收集器抓不到當機。其實是開關沒能讓 App 當機,如果怪到收集器頭上,就會去修好好的程式碼,真正的漏洞反而留著。查下去,原因出在開關。WebView 早就掛好的訊號處理器,搶先攔下了那個訊號。

修法只有一行:送出訊號之前,先把 SIGSEGV 還原成預設行為。這樣 App 就當機了,下次啟動時,WebView 的異常終止紀錄和 iOS 整理好的 SIGSEGV 報告都送達了。我就在這天學到,測試工具有可能比被測試的對象更早出錯。

奇奇背包的背包整理畫面。新人和主任的格子裡放著物品的形狀
這款遊戲也裝了收集器。為了看它會不會當機,我先修好了讓它當機的程式碼。

誤判二:我以為上架後立刻收到的錯誤是使用者的

收集器有嚴重度標準。啟動後 8 秒內發生的啟動錯誤只要有 2 場以上,就判定為嚴重,立刻準備熱修。第一週有兩款遊戲踩到這條線:瓦普塔 1.0.10 和奇奇背包 1.0.0,都是剛上架 Play 之後,而且是同一個錯誤。著色器連結失敗,uniform 數量是 261。

我當時以為是我的遊戲在使用者手機上啟動到一半就死了。不是。我把瓦普塔 1.0.10 放到工作用手機(Adreno 740)上跑,錯誤是 0,而 261 這個數字,是 Google 虛擬裝置使用的軟體算圖器(SwiftShader)的上限值。我把 Play 在上架後立刻跑的發布前測試機器人所產生的錯誤,當成了真人的錯誤。

一開始的判讀實際情況
錯誤內容啟動中著色器連結失敗(uniform 261)同一個錯誤,虛擬裝置的上限值
從哪裡來使用者的手機Firebase Test Lab 虛擬裝置(SwiftShader)
工作用手機(Adreno 740)上的 1.0.10尚未確認錯誤 0
嚴重度判定2 件需要熱修不需要熱修
瓦普塔的遊玩畫面。黃色小雞站在綠色果凍般的階梯上
瓦普塔。出錯的那台裝置,連這個畫面都畫不出來,它是虛擬裝置。

所以我改了什麼

只要收集器是在軟體算圖器或 Firebase Test Lab 裝置上跑,就完全不送出 session 和錯誤。我在工作用手機上親自確認過:打開標記就被辨識為機器人,關掉就被辨識為真人。我也把它加進同步檢查,避免出現漏掉這道防護的複本。

第一週得到的規則有兩條。測試用的開關,先確認那個開關真的有用。新的監控裝置,先把自己製造的雜訊濾掉。

瓦普塔的大廳畫面。依點心主題挑選的五張卡片
出現同一個錯誤的兩款遊戲之一的起始畫面。

如果你也一樣,可以先試試這些

如果你是第一次裝當機收集器的獨立開發者,我建議照這個順序。

  • 寫了故意讓 App 當機的程式碼,先在實機上確認 App 真的會死。
  • 當機之後,還要看下次啟動時報告有沒有送達。
  • Play 上架後立刻收到的錯誤,先和發布前報告的裝置清單對照。
  • 可疑的錯誤,用同一個版本在一支真實手機上重現看看。
  • 新的通知標準,第一週先數自己製造了多少雜訊。

FAQ

要怎麼故意讓 iOS App 當機,來測試當機收集器?

我用的是對 App 處理程序送出 SIGSEGV 訊號的開關。在 iPhone 11 Pro 實機上,WebView 掛的訊號處理器攔下了它,App 沒有死;送出訊號之前先把 SIGSEGV 還原成預設行為,App 就死了。當機之後,也請一併確認下次啟動時報告有沒有送達。

Play Console 的發布前報告出現當機,使用者也會遇到嗎?

我的情況不是。那是上架後立刻只在 Firebase Test Lab 虛擬裝置上出現的算圖器錯誤,我把瓦普塔 1.0.10 放到實機(Adreno 740)上跑,錯誤是 0。建議先確認發布前報告裡的裝置清單。

當機收集器會蒐集什麼?

我用的收集器會蒐集 WebView 錯誤、出錯前最後一個操作、錯誤相對於場數的比例,以及原生當機。啟動後 8 秒內的啟動錯誤只要有 2 場以上,就判定為嚴重並準備熱修。

更多文章

新遊戲與小消息,大約每月一封。

其他語言English한국어日本語繁體中文