为 C++ 和 Rust 代码设置并运行 zxdb(Fucsia 的调试程序)

在 Fuchsia 上启动 zxdb 非常简单,只需一条命令即可:

ffx debug connect

调试程序启动后,应该会显示

Connecting (use "disconnect" to cancel)...
Connected successfully.
👉 To get started, try "status" or "help".
[zxdb]

无论您在树内还是在树外使用模拟器或硬件设备,它都能工作 95%。如果它没有按预期运行,请查看下面的故障排除步骤。

问题排查

build 类型兼容

Fuchsia 上的调试程序依赖于特权系统调用,最值得注意的是 zx_process_write_memory。仅当内核标记 kernel.enable-debugging-syscalls 设置为 true 时,才会启用这些系统调用,这意味着调试程序不适用于 useruserdebug build 类型

如果从源代码构建,则大多数可能启用了这些系统调用。

zxdb 和 debug_agent

Zxdb 依赖于名为 debug_agent 的目标端组件。如果错误消息显示“The plugin service selector 'core/debug_agent:expose:fuchsia.debugger.DebugAgent' does not match any services on the target”,则说明未构建 debug_agent。您还可以检查 build 目录中是否存在 debug_agenthost_x64/zxdb

如果您的 build 中没有调试程序,请使用以下任一方式将 //bundles/tools 添加到您的“宇宙”中:

fx <normal_stuff_you_use> --with //bundles/tools

或者,您可以通过修改 <build_dir>/args.gn 并将其添加到底部来直接修改 GN 参数:

universe_package_labels += [ "//bundles/tools" ]

ffx 能与设备通信

确保 ffx 可以发现设备(模拟器或硬件设备),并在设备上启动 RCS。

$ 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]

文件包服务器正在运行

对于大多数 build 配置,调试代理将位于“宇宙”(即“可供使用”)中,但不在基础 build 中,因此在启动前也不会存在于系统中。您需要运行:

fx serve

调试符号已注册

默认情况下,Zxdb 将从符号索引获取调试符号的位置。树内和大多数树外环境中的调试符号注册都是自动执行的。如果这些命令不起作用,可以使用 zxdb 中的三个命令行标志为 zxdb 提供额外的符号查找位置:--build-id-dir--ids-txt 和常规 --symbol-path。它们都具有相应的设置,可以使用 setget 进行操作。

例如,如需添加“.build-id”目录,请使用 --build-id-dir 标志:

ffx debug connect -- --build-id-dir some/other_location/.build-id

或者,将其添加到互动式界面中的 build-id-dirs 列表选项中:

[zxdb] set build-id-dirs += some/other_location/.build-id

对于树内开发,ffx debug connect 会自动设置所有必要的标志。

build-id-dir

某些 build 会生成 .build-id 目录。其中的符号文件已根据其 build ID 编入索引。例如,Fucsia build 本身会在 build 目录中创建一个 .build-id 目录,例如out/x64/.build-id。您可以通过 --build-id-dir 命令行标志或 build-id-dirs 设置将它们添加到 zxdb。这是最佳选项。

ids-txt

某些 build 不会生成 .build-id 目录,而是生成一个名为 ids.txt 的文件,该文件会列出 build ID 和相应二进制文件的本地路径。您可以通过 --ids-txt 命令行标志或 ids-txts 设置将它们添加到 zxdb。这是次优选项。

symbol-path

此外,--symbol-path 标志还可用于将任意文件或目录添加到符号索引。如果该路径指向某个文件,系统会将其视为 ELF 文件,并将其添加到符号索引中。 如果它是一个目录,则会将给定路径下的所有二进制文件编入索引。

源代码位置已正确设置

Fuchsia build 生成相对于 build 目录的符号,因此相对路径类似于 ../../src/my_component/file.cc。build 目录通常由符号索引提供,因此可以找到源文件。

如果找不到文件,您需要手动调整源映射设置。例如,如果调试程序找不到 ./../../src/my_component/file.cc,而文件位于 /path/to/fuchsia/src/my_component/file.cc,您可以

[zxdb] set source-map += ./../..=/path/to/fuchsia

因此,调试程序将查找 /path/to/fuchsia/src/my_component/file.cc。如需更多帮助,请查看 get source-map