本页列出了 zxdb 的常见问题排查提示:
- 确保已构建 zxdb 和
debug_agent - 确保 ffx 可以与设备通信
- 确保 Fuchsia 软件包服务器正在运行
- 诊断符号问题
- 验证软件包服务是否适用于 debug_agent
- 检查调试器组件是否存在
确保 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]
确保 Fuchsia 软件包服务器正在运行
对于大多数树内 build 配置,zxdb 使用的 debug_agent 位于 universe 依赖项集中,但不在基本依赖项集中,因此在启动之前不会位于 Fuchsia 目标设备上。这可能会导致您看到类似于以下内容的错误:
BUG: An internal command error occurred.
Error: Attempted to find protocol marker fuchsia.debugger.Launcher at '/toolbox' or '/core/debugger', but it wasn't available at either of those monikers.
Make sure the target is connected and otherwise functioning, and that it is configured to provide capabilities over the network to host tools.
1. This service dependency exists but connecting to it failed with error CapabilityConnectFailed. Moniker: /core/debugger. Capability name: fuchsia.debugger.Launcher
More information may be available in ffx host logs in directory:
如果您看到此类错误,请确保 fx serve 在单独的终端中运行。例如:
fx serve使用符号诊断问题
调试符号已注册
默认情况下,zxdb 会从符号索引获取调试符号的位置。来自树内和大多数树外环境的调试符号的注册是自动化的。
如果符号注册失败,zxdb 会提供以下命令行选项来提供额外的符号查找位置:
这些选项具有可使用 set 或 get 进行操控的设置。
例如,如需添加 .build-id 目录,您可以执行以下任一操作:
设置 build-id-dirs
set build-id-dirs += some/other_location/.build-id
--build-id-dir 标志
ffx debug connect -- --build-id-dir some/other_location/.build-idbuild-id-dir
某些 build 会生成 .build-id 目录。此目录中的符号文件会根据其 build ID 进行索引。例如,Fuchsia build 会在其 build 目录中创建一个 .build-id 目录,例如out/x64/.build-id。
您可以通过 build-id-dirs 设置或 --build-id-dir 将这些目录添加到 zxdb。
ids-txt
某些 build 会生成一个名为 ids.txt 的文件,其中列出了 build ID 以及相应二进制文件的本地路径,而不是 .build-id 目录。可以通过 ids-txts 设置或 --ids-txt 命令行标志将这些文件添加到 zxdb。
symbol-path
--symbol-path 标志可用于向符号索引添加任意文件或目录。如果路径指向的是文件,zxdb 会将其视为 ELF 文件并将其添加到符号索引中。如果它是目录,则会为给定路径下的所有二进制文件编制索引。
检查符号状态
sym-stat 命令会返回符号的状态。如果没有正在运行的进程,则返回您指定的不同符号位置的相关信息。如果未找到符号,请确保这符合您的预期。
如需查看符号的状态,请运行 sym-stat:
sym-stat
Symbol index status
Indexed Source path
(folder) /home/alice/.build-id
(folder) /home/alice/build/out/x64
0 my_dir/my_file
如果您在 Symbol index status 的 Indexed 列中看到 0,则表示 zxdb 找不到符号的来源。如果您无法调试问题,请提交 zxdb bug。
变量值不可用
Zxdb 可能会返回与变量值相关的问题,这在大多数情况下与程序的优化级别有关。例如:
已优化掉:这表示程序符号声明了一个具有指定名称的变量,但该变量没有值或位置。这表示编译器已完全优化掉该变量,因此调试器无法显示它。如果您需要查看变量,请使用优化程度较低的 build 设置。
不可用:表示变量在当前地址无效,但在其他地址已知其值。在优化后的代码中,编译器通常会重复使用寄存器,这可能会覆盖之前的值,导致这些值无法再使用。
例如,您可以使用 sym-info 命令查看 my_variable 变量的有效范围:
sym-info my_variable
Variable: my_variable
Type: int
DWARF tag: 0x05
DWARF location (address range + DWARF expression bytes):
[0x3e0d0a3e05b, 0x3e0d0a3e0b2): 0x70 0x88 0x78
[0x3e0d0a3e0b2, 0x3e0d0a3eb11): 0x76 0x48 0x10 0xf8 0x07 0x1c 0x06
DWARF location 可为您提供变量值已知的地址范围列表。地址范围的开头包含相应值,但结尾不包含相应值。
DWARF expression bytes 表示查找变量的内部说明。
您还可以使用 di 命令查看当前地址。
源代码位置已正确设置
Fuchsia build 会生成相对于 build 目录的符号。相对路径类似于 ../../src/my_component/file.cc。build 目录通常由符号索引提供,以便找到源文件。
如果系统找不到您的源文件,您需要手动设置源映射设置。
例如,如果调试器找不到 ./../../src/my_component/file.cc,但该文件位于 /path/to/fuchsia/src/my_component/file.cc,您需要设置 source_map:
[zxdb] set source-map += ./../..=/path/to/fuchsia
设置 source-map 后,zxdb 会查找 /path/to/fuchsia/src/my_component/file.cc。
来源行不匹配
有时,源文件列表可能与代码不匹配。最常见的原因是 build 已过时,不再与来源匹配。调试器会检查符号文件修改时间是否比源文件新,但仅在首次显示文件时打印警告。
部分用户有多次结账。将 -f 选项与 list 命令搭配使用,以检查 zxdb 找到的文件的文件名。例如:
list -f
/home/alice/fuchsia/out/x64/../../src/foo/bar.cc
... <source code> ...
如果 zxdb 在错误的签出中找到了文件,请按照调试符号已注册中所述,替换 build-dirs 选项。
您可以设置 show-file-paths 选项来增加文件路径的信息。当此设置设为 true 时:
- 它会在源代码列表(如
list -f中所示)中显示完整的已解析路径。 - 它会显示完整路径,而不仅仅是文件名。
如需将 show-file-paths 设置为 true,请执行以下操作:
set show-file-paths true
设置断点时
在特定行上设置断点时,您可能会注意到不匹配的源行,即显示的断点位置与您输入的行号不匹配。在大多数情况下,这是因为这些符号未标识指定行上的任何代码,因此 zxdb 使用了下一行。即使在未优化的 build 中,也可能会发生这种情况,并且最常见于变量声明。
b file.cc:138
Breakpoint 1 (Software) @ file.cc:138
138 int my_value = 0; <- Breakpoint was requested here.
◉ 139 DoSomething(&my_value); <- But ended up here.
140 if (my_value > 0) {
验证软件包服务是否适用于 debug_agent
如果您怀疑 debug_agent 软件包的提供失败,请检查以确保软件包提供在您的 Fuchsia 签出设置中正常运行。
直接在设备 shell 上使用 pkgctl 来解析软件包:
针对
debug_agent软件包运行resolve命令,例如:fx shell pkgctl resolve fuchsia-pkg://fuchsia.com/debug_agent如需确认软件包是否已成功解析,请检查软件包解析器统计信息:
ffx inspect show core/pkg-resolver:root/resolver_service/successful_resolves查找
source = TUF和debug_agent软件包的哈希与 Fuchsia 源代码签出设置中的out/default/amber-files/repository/targets.json文件中的值相匹配的条目。
检查调试器组件是否存在
如果在设置 zxdb 时 ffx debug connect 命令失败,请使用 ffx component list 命令检查目标设备上是否实际存在 debugger 组件,例如:
ffx component list | grep debugger此命令需要返回 core/debugger,ffx debug connect 才能正常运行。