概览
Zircon 中的异常会分以下几个阶段处理:
调试程序会收到异常通知(“第一次机会”)。在这种情况下,调试程序可能会停止此阶段的异常处理(例如,调试程序可能会在发生单步异常或断点异常后继续运行)。
调试程序可以选择将异常转发到常规处理程序,就好像调试程序不存在一样。此时,程序本身可能会解决异常。
如果未处理,调试程序将再次获得异常,作为“第二次机会”异常。
转发异常
在异常发生后继续执行(通过 continue
、step
、next
等)将重新运行除外的指令。通常,这会导致再次出现相同的异常,使程序无法继续运行。特别是,这会导致 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 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.