处理例外情况

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