| # Work with exceptions |
| |
| [Exceptions in Zircon](/docs/concepts/kernel/exceptions.md) are handled in |
| several phases: |
| |
| 1. zxdb is notified of an exception which is called the "first chance". |
| At this stage, zxdb may handle this exception. For example, if the debugger |
| continues after a single-step or breakpoint exception, the case exception |
| processing stops. |
| |
| 1. zxdb can choose to forward the exception to the normal handlers as if a |
| debugger were not present. Then, the component itself may resolve the |
| exception. |
| |
| 1. If at this stage, the exception is still unhandled, zxdb gets the exception |
| again as a "second chance" exception. |
| |
| ## Forwarding exceptions |
| |
| If an exception is found and execution is continued through `continue`, `step`, |
| `next`, etc..., zxdb re-runs the excepting instruction. Normally, this causes |
| the same exception again and the component execution cannot make progress. |
| |
| This behavior can cause problems with `gtest`, where an exception is |
| the expected result of the test. This is called a "death test". However, the |
| test harness expects to catch this exception and continue with the test. |
| |
| To forward the exception to the component, the exception needs to be explicitly |
| forwarded. You can forward the exception with `--forward` to `continue` command: |
| |
| For example, upon the expected crash, a death test reports: |
| |
| ```none {:.devsite-disable-click-to-copy} |
| ══════════════════════════ |
| 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 |
| ``` |
| |
| You can then continue with the test by using `--forward`: |
| |
| Note: The `--forward` option can also be expressed with `-f`. |
| |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } |
| continue --forward |
| ``` |
| |
| ## Automatically forwarding certain types of exceptions |
| |
| zxdb can automatically forward certain exception types to the component and only |
| handle them as second chance exceptions. By default, only page faults are |
| included. |
| |
| The debugger's `second-chance-exception` setting contains the list of exceptions |
| that are handled only as second-chance by default. This setting holds a list of |
| exception type abbreviations: |
| |
| * `gen`: General |
| * `pf`: Page faults |
| * `ui`: Undefined instruction |
| * `ua`: Unaligned access |
| |
| See the debugger's `help get` and `help set` for more details on dealing with list settings. Some |
| examples: |
| |
| To list the current values of `second-chance-exceptions`: |
| |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } |
| get second-chance-exceptions |
| ``` |
| |
| To add the general exception type to `second-chance-exceptions`: |
| |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } |
| set second-chance-exceptions += gen |
| ``` |
| |
| To remove the page fault type from the list of `second-chance-exceptions`: |
| |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } |
| set second-chance-exceptions -= pf |
| ``` |