# Advanced topics

Once you are familiarized with the basic functionality of the Fuchsia debugger,
zxdb, you may want to:

* [Debug a crash dump](#debug-crash-dump)
* [Download symbols](#download-symbols)
* [Attach to an existing process](#attach-process)

## Debug a crash dump {#debug-crash-dump}

Zxdb supports loading a minidump generated by a crash report. For a more
detailed example of debugging a crash dump, see
[Tutorial: Debug minidumps using zxdb][zxdb-tutorial-minidumps]

You can use the [`ffx debug core`](https://fuchsia.dev/reference/tools/sdk/ffx#core)
command to load a crash report, for example:

```none
ffx debug core {{ '<var>crash_dump_file</var>' }}
```

## Download symbols {#download-symbols}

Zxdb automatically searches servers registered in the
[symbol-index][ffx-debug-symbol-index] for symbols that are not found in any
locally configured symbol directories. You can see the complete list of symbol
servers registered in your symbol-index with the following command:

```posix-terminal
ffx debug symbol-index list -a
```

This recursively traverses and resolves all symbol-index files that are included
in the global symbol-index. For more information see
[About symbol settings][about-symbol-settings].

The servers that appear are used to download symbol files and load them to
the debugger asynchronously. For particularly large debug info files, you may
see output like this from `sym-stat` in zxdb:

```none{: .devsite-terminal data-terminal-prefix="[zxdb]" }
sym-stat
...
    Base: 0xc37e9000
    Build ID: ba17ef8c43bccf5fb6bf84f9a8d83d9cf3be8976 (Downloading...)
    Symbols loaded: No
...
```

This indicates that a download is in progress. Once the file is downloaded,
zxdb indexes the symbols from the newly downloaded file and debugging can
continue.

## Attach to an existing process {#attach-process}

In most cases, you should not attach to a specific process unless you are
automating a zxdb workflow. If you are using zxdb without automation, you
should attach zxdb to a component identifier, see [Run zxdb][zxdb-readme-run].

You can attach to most running processes given the process’ koid (the
[kernel object ID][koid-concept]). zxdb provides a `ps` command to see the
processes that are running on a Fuchsia device or emulator.

Before you try to run `ps`, make sure that you attach zxdb to a component, or
at a minimum connect to the Fuchsia device:

Note: This command fails if you do not have an active Fuchsia device or
emulator. For additional ways to attach the debugger, see
[zxdb: The Fuchsia debugger][zxdb-readme].

For example, to connect to the `core/starnix_runner` component:

```posix-terminal
ffx component debug core/starnix_runner
```

Once the debugger is connected, you can run `ps` to see a listing of all of the
active processes on the Fuchsia device or emulator:

```none {: .devsite-terminal data-terminal-prefix="[zxdb]" }
ps
 j: 1033 root
   p: 1102 bin/component_manager
   j: 1662
     j: 1811 bootstrap/console fuchsia-boot:///console#meta/console.cm
       p: 1845 console.cm
...
     j: 66524 core/starnix_runner fuchsia-pkg://fuchsia.com/starnix#meta/starnix_runner.cm
▶      p: 66562 starnix_runner.cm
     j: 66763
       j: 66764 core/starnix_runner/kernels:RW3JlbU starnix_kernel#meta/starnix_kernel.cm
         p: 66797 starnix_kernel.cm
         p: 67333 init
     j: 88021
       p: 88084 debug_agent.cm
   j: 4227 zircon-shell
     p: 4608 sh:console
```

From the output above:

* `j` indicates a [job](/docs/concepts/kernel/concepts.md) which is a container
  for processes.
* `p` indicates a process.

The number that follows the job or process is the object's KOID. You can then:

* [Attach to a specific process](#attach-process)
* [Attach to processes in a specific job](#attach-job)

### Attach to a specific process {#attach-process}

From the zxdb console, you can attach to a specific process. For example,
to attach to the `starnix_kernel.cm` process which is listed with a KOID of `66797`:

```none {: .devsite-terminal data-terminal-prefix="[zxdb]" }
attach 66797
Attached Process 2 state=Running koid=66797 name=starnix_kernel.cm component=starnix_kernel.cm
Loading 15 modules for starnix_kernel.cm ....
[zxdb]
```

### Attach to all processes in a specific job {#attach-job}

From the zxdb console, you can attach to all the processes that are part of a
job. For example, to attach to the `core/starnix_kernels:RW3JlbU` job which is
listed with a KOID of `66764`:

```none {: .devsite-terminal data-terminal-prefix="[zxdb]" }
attach -j 66764
Waiting for process matching "job 66764".
Type "filter" to see the current filters.
Attached Process 2 state=Running koid=66797 name=starnix_kernel.cm component=starnix_kernel.cm
Attached Process 3 state=Running koid=67333 name=init component=starnix_kernel.cm
Loading 15 modules for starnix_kernel.cm .....Done.
Loading 17 modules for init Done.
```

#### Attach to a specific process in a job {#attach-job-process}

From the zxdb console, you can attach to a specific process that is part of a
job. For example, to attach to the `starnix_kernel.cm` process which is part of
the job with a KOID of `66764`:

```none {: .devsite-terminal data-terminal-prefix="[zxdb]" }
attach -j 66764 starnix_kernel.cm
Waiting for process matching "starnix_kernel.cm".
Type "filter" to see the current filters.
Attached Process 2 state=Running koid=66797 name=starnix_kernel.cm component=starnix_kernel.cm
Attached Process 3 state=Running koid=67333 name=init component=starnix_kernel.cm
Loading 15 modules for starnix_kernel.cm .....Done.
Loading 17 modules for init Done.
[zxdb]
```

<!-- Reference links -->

[koid-concept]: /docs/concepts/kernel/concepts.md#kernel_object_ids
[zxdb-readme]: /docs/development/debugger/README.md
[zxdb-readme-run]: /docs/development/debugger/README.md#run_zxdb
[zxdb-tutorial-minidumps]: /docs/development/debugger/tutorial-minidumps.md
[ffx-debug-symbol-index]: /docs/development/tools/ffx/workflows/register-debug-symbols.md
[about-symbol-settings]: symbols.md#about_symbol_settings
