blob: 1a7ab7048db81128313d424dfc65fa2d5233d86d [file] [log] [blame] [view]
# Set up and run zxdb, Fuchsia's debugger for C++ and Rust code
Launching zxdb on Fuchsia is as simple as one command:
```posix-terminal
ffx debug connect
```
When the debugger is launched, it should show
```none
Connecting (use "disconnect" to cancel)...
Connected successfully.
👉 To get started, try "status" or "help".
[zxdb]
```
It'll work 95% of the time, regardless of whether you work in-tree or out-of-tree, using an emulator
or a hardware device. If it doesn't work as expected, please check the troubleshooting below.
## Troubleshooting
### The build type is compatible
Debuggers on Fuchsia depend on privileged syscalls, most notably
[`zx_process_write_memory`](/reference/syscalls/process_write_memory.md).
These syscalls are only enabled when the kernel flag
[`kernel.enable-debugging-syscalls`](/docs/gen/boot-options.md#kernelenable-debugging-syscallsbool)
is set to `true`, which means debuggers are not available for `user` and `userdebug`
[build types](/docs/contribute/governance/rfcs/0115_build_types.md).
If you are building from source, most probably these syscalls are enabled.
### zxdb and debug_agent are built
Zxdb depends on a target-side component called debug\_agent. If an error message says "The plugin
service selector 'core/debug\_agent:expose:fuchsia.debugger.DebugAgent' did not match any services
on the target", it means that debug\_agent is not built. You can also check whether there's
`debug_agent` and `host_x64/zxdb` in your build directory.
If you don't have the debugger in your build, add `//bundles/tools` to your "universe", either with:
```posix-terminal
fx <normal_stuff_you_use> --with //bundles/tools
```
Or you can edit your GN args directly by editing `<build_dir>/args.gn` and adding to the bottom:
```none
universe_package_labels += [ "//bundles/tools" ]
```
### ffx can talk with the device
Make sure that ffx can discover the device, either a emulator or a hardware device, and
RCS is started on the device.
```
$ ffx target list
NAME SERIAL TYPE STATE ADDRS/IP RCS
demo-emu <unknown> core.x64 Product [10.0.2.15, Y
fec0::90e:486e:b6b5:9780,
fec0::487b:fabd:20fa:43ee,
127.0.0.1]
```
### Package server is running
For most build configurations, the debug agent will be in the "universe" (i.e. "available to use")
but not in the base build so won't be on the system before boot. You will need to run:
```posix-terminal
fx serve
```
### Debug symbols are registered {#set-symbol-location}
Zxdb will by default obtain the locations of the debug symbols from the
[symbol index](/docs/development/sdk/ffx/register-debug-symbols.md).
The registrations of debug symbols from in-tree and most out-of-tree environments are automated.
In case these doesn't work out, there are three command-line flags in zxdb to provide additional
symbol lookup locations for zxdb: `--build-id-dir`, `--ids-txt`, and a general `--symbol-path`.
They all have the corresponding settings that can be manipulated using `set` or `get`.
For example, to add a ".build-id" directory, either use `--build-id-dir` flag:
```posix-terminal
ffx debug connect -- --build-id-dir some/other_location/.build-id
```
Or add it to the `build-id-dirs` list option in the interactive UI:
```none {:.devsite-disable-click-to-copy}
[zxdb] set build-id-dirs += some/other_location/.build-id
```
For in-tree development, `ffx debug connect` automatically sets up all necessary
flags.
#### `build-id-dir`
Some builds produce a `.build-id` directory. Symbol files in it are already indexed according to
their build IDs. For example, the Fuchsia build itself makes a `.build-id` directory inside the
build directory, e.g., `out/x64/.build-id`. They can be added to zxdb by `--build-id-dir`
command-line flag or `build-id-dirs` setting. This is the best option.
#### `ids-txt`
Instead of a `.build-id` directory, some builds produce a file called `ids.txt` that lists build IDs
and local paths to the corresponding binaries. They can be added to zxdb by `--ids-txt` command-line
flag or `ids-txts` setting. This is the second-best option.
#### `symbol-path`
In addition, `--symbol-path` flag can be used to add arbitrary files or directories to symbol index.
If the path is pointing to a file, it will be treated as an ELF file and added to the symbol index.
If it's a directory, all binaries under the given path are indexed.
### Source code location is correctly set up
The Fuchsia build generates symbols relative to the build directory so relative paths look like
`../../src/my_component/file.cc`. The build directory is usually provided by the symbol index,
so the source files can be located.
If your files are not being found, you will need to manually tweak the source map setting.
For example, if the debugger cannot find `./../../src/my_component/file.cc`, and the file is
located at `/path/to/fuchsia/src/my_component/file.cc`, you could
```none
[zxdb] set source-map += ./../..=/path/to/fuchsia
```
So the debugger will look for `/path/to/fuchsia/src/my_component/file.cc` instead. For more help,
please check `get source-map`.