处理 zxdb 中的异常

概览

Zircon 中的异常会分以下几个阶段处理:

  1. 调试程序会收到异常通知(“第一次机会”)。在这种情况下,调试程序可能会停止此阶段的异常处理(例如,调试程序可能会在发生单步异常或断点异常后继续运行)。

  2. 调试程序可以选择将异常转发到常规处理程序,就好像调试程序不存在一样。此时,程序本身可能会解决异常。

  3. 如果未处理,调试程序将再次获得异常,作为“第二次机会”异常。

转发异常

在异常发生后继续执行(通过 continuestepnext 等)将重新运行除外的指令。通常,这会导致再次出现相同的异常,使程序无法继续运行。特别是,这会导致 gtest“死亡测试”出现问题,在这种情况下,异常是测试的预期结果。自动化测试框架应捕获此异常并继续进行测试。

如需将异常转发给程序,需要明确转发异常。您可以通过在 continue 命令中添加 --forward(简称 -f)标志来实现此目的:

例如,在发生预期崩溃时,死亡测试将报告以下内容:

══════════════════════════
 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": 一般
  • "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.