處理 zxdb 中的例外狀況

總覽

系統會分階段處理 Zircon 中的例外狀況

  1. 偵錯工具會收到例外狀況通知 (「第一次機會」)。偵錯工具可能會處理這個階段的例外狀況 (例如,偵錯工具可能會在單一步驟或中斷點例外狀況之後繼續),在這種情況下,系統會停止例外狀況處理作業。

  2. 偵錯工具可以選擇將例外狀況轉送至一般處理常式,就如同沒有偵錯工具一樣。此時,程式可能會解決例外狀況。

  3. 如果仍未處理,偵錯工具會再次取得例外狀況,並視為「第二次機會」的例外狀況。

轉送例外狀況

在例外狀況後繼續執行 (透過 continuestepnext 等) 會重新執行例外狀況指令。一般而言,這樣會導致再次發生相同的例外狀況,而程式也不會進行進度。特別是,這會導致 gtest「死亡測試」出現問題,例如測試結果的預期結果為例外狀況。測試控管工具預期可以擷取這個例外狀況,並繼續執行測試。

如要將例外狀況轉送至計畫,必須明確轉送例外狀況。您可以使用 --forward (-f 為簡稱 -f) 旗標對 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

繼續測試:

[zxdb] continue --forward

[zxdb] c -f             # Alternate Short form.

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

偵錯工具會自動將某些例外狀況類型轉送至程式,且只會處理這些類型為第二次的例外狀況。根據預設,只有頁面錯誤會納入計算。

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

  • "gen": General
  • 「pf」:網頁錯誤
  • 「ui」:未定義的指示
  • 「ua」:未對齊存取權

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

[zxdb] get second-chance-exceptions           # List the current values.

[zxdb] set second-chance-exceptions += gen    # Add "general" to the list.

[zxdb] set second-chance-exceptions -= pf     # Remove "page fault" from the list.