本页列出了 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 (ffx.log) in directory:
<directory>
To inspect, run: tail -f "<directory>/ffx.log"
如果您看到此类错误,请确保 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 目录(例如 out/x64/.build-id)中创建一个 .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 可能会返回与变量值相关的问题,在大多数情况下,这与程序的优化级别有关。例如:
Optimized out:这表示程序符号声明了具有给定名称的变量,但该变量没有值或位置。这表示编译器已完全优化掉该变量,调试程序无法显示它。如果您需要查看变量,请使用优化程度较低的 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。构建目录通常由符号索引提供,以便可以找到源文件。
如果找不到源文件,您需要手动设置源映射设置。
例如,如果调试程序找不到 ./../../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 bootstrap/pkg-cache:root/fuchsia.pkg.PackageResolver-full/recent查找
authority = "tuf"和debug_agent软件包的哈希值与 Fuchsia 源代码检出设置中的out/default/amber-files/repository/targets.json文件中的值匹配的条目。
检查调试程序组件是否存在
如果 ffx debug connect 命令在设置 zxdb 时失败,请使用 ffx component list 命令检查目标设备上是否确实存在 debugger 组件,例如:
ffx component list | grep debugger此命令需要返回 core/debugger,ffx debug connect 才能正常运行。