總覽
系統會分階段處理 Zircon 中的例外狀況:
偵錯工具會收到例外狀況通知 (「第一次機會」)。偵錯工具可能會處理這個階段的例外狀況 (例如,偵錯工具可能會在單一步驟或中斷點例外狀況之後繼續),在這種情況下,系統會停止例外狀況處理作業。
偵錯工具可以選擇將例外狀況轉送至一般處理常式,就如同沒有偵錯工具一樣。此時,程式可能會解決例外狀況。
如果仍未處理,偵錯工具會再次取得例外狀況,並視為「第二次機會」的例外狀況。
轉送例外狀況
在例外狀況後繼續執行 (透過 continue
、step
、next
等) 會重新執行例外狀況指令。一般而言,這樣會導致再次發生相同的例外狀況,而程式也不會進行進度。特別是,這會導致 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 get
和 help 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.