[Exceptions in Zircon](https://fuchsia.dev/docs/concepts/kernel/exceptions) 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.

2. 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.

3. 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:

    ══════════════════════════
     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]
> **Note:** The `--forward` option can also be expressed with `-f`.

    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`:

    get second-chance-exceptions

To add the general exception type to `second-chance-exceptions`:

    set second-chance-exceptions += gen

To remove the page fault type from the list of `second-chance-exceptions`:

    set second-chance-exceptions -= pf

[](https://issues.fuchsia.dev/issues/new?component=1439230&template=1881640&description=Issue+on:+https://fuchsia.dev/docs/development/debugger/exceptions.md "Report a bug or suggest improvements on this page") [](https://cs.opensource.google/fuchsia/fuchsia/+/main:docs/development/debugger/exceptions.md "View the source code of this page") [](https://ci.android.com/edit?repo=fuchsia/fuchsia/main&file=docs/development/debugger/exceptions.md&cloneRepo=fuchsia/fuchsia:refs/heads/main&fullPath=fuchsia/docs/development/debugger/exceptions.md "Edit the source code of this page")