在 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
时,才会启用这些系统调用,这意味着调试程序不适用于 user
和 userdebug
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_agent
和 host_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
。它们都具有相应的设置,可以使用 set
或 get
进行操作。
例如,如需添加“.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
。