處理例外狀況

Zircon 中的例外狀況 階段:

  1. zxdb 收到「第一次機會」例外狀況的通知。 在這個階段,zxdb 可能會處理這個例外狀況。舉例來說 在單一步驟或中斷點例外狀況發生後繼續執行,例外狀況例外狀況 也會停止處理程序。

  2. zxdb 可選擇將例外狀況轉送至一般處理常式 偵錯工具不存在。接著,元件本身可能會解析 例外狀況。

  3. 如果在這個階段,系統仍無法處理例外狀況,zxdb 就會取得例外狀況 再次當做「第二次機會」例外狀況。

轉送例外狀況

如果發現例外狀況並繼續執行 continuestepnext 等... zxdb 會重新執行例外指令。這通常是因為 ,元件執行作業無法繼續執行。

這項行為可能會導致 gtest 發生問題,但下列情況除外 以及預期的測試結果這就是所謂的「死亡測試」。不過, 測試控管工具會擷取此例外狀況並繼續執行測試。

如要將例外狀況轉送至元件,必須明確指出例外狀況 轉寄。您可以使用 --forward 將例外狀況轉送至 continue 指令:

舉例來說,在預期發生當機時,死亡測試報告如下:

══════════════════════════
 Invalid opcode exception
══════════════════════════
 Process 2 (koid=57368) thread 7 (koid=57563)
 Faulting instruction: 0x4356104fba24

🛑 Process 2 Thread 7 scudo::die() • fuchsia.cpp:28
   26 uptr getPageSize() { return PAGE_SIZE; }
   27
 ▶ 28 void NORETURN die() { __builtin_trap(); }
   29
   30 // We zero-initialize the Extra parameter of map(), make sure this is consistent

接著,您可以使用 --forward 繼續測試:

[zxdb] continue --forward

自動轉送特定類型的例外狀況

zxdb 可以自動將某些例外狀況類型轉送到元件 並將這種情況視為第二次機會例外狀況根據預設,只有頁面錯誤 包含。

偵錯工具的 second-chance-exception 設定包含例外狀況清單 且預設只會做為第二階段處理這項設定包含 例外狀況類型縮寫:

  • gen:一般
  • pf:頁面錯誤
  • ui:未定義的指示
  • ua:未對齊存取權

如要進一步瞭解如何處理清單設定,請參閱偵錯工具的 help gethelp set。只有部分通知 範例:

如要列出 second-chance-exceptions 目前的值:

[zxdb] get second-chance-exceptions

如何將一般例外狀況類型新增至 second-chance-exceptions

[zxdb] set second-chance-exceptions += gen

如要從 second-chance-exceptions 清單中移除網頁錯誤類型:

[zxdb] set second-chance-exceptions -= pf