Zircon 中的异常在 多个阶段:
zxdb 会收到一个称为“首次机会”的异常的通知。 在此阶段,zxdb 可以处理此异常。例如,如果调试程序 在单步或断点异常之后继续,案例异常 处理停止。
zxdb 可以选择将异常转发给普通处理程序,就像 调试程序不存在。然后,该组件本身可能会解析 异常。
如果在此阶段,异常仍未得到处理,则 zxdb 会获取该异常 再次进行申请异常。
转发异常
如果发现异常并通过 continue
、step
、
next
等...,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 get
和 help 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