对 zxdb 进行问题排查

本页面列出了 zxdb 的常见问题排查提示:

确保 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 可通过这些命令行选项 其他符号查找位置:

这些选项包含可使用 setget 控制的设置。

例如,如需添加 .build-id 目录,您可以执行以下任一操作:

设置build-id-dirs

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

--build-id-dir 标记

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

build-id-dir

某些构建会生成 .build-id 目录。此目录中的符号文件为 根据 build ID 编入索引。例如,Fuchsia build .build-id 目录,例如out/x64/.build-id

您可以通过 build-id-dirs 设置将这些目录添加到 zxdb 中,也可以 --build-id-dir

ids-txt

某些 build 会生成一个名为 ids.txt 的文件,而不是 .build-id 目录 其中列出了相应二进制文件的 build ID 和本地路径。这些文件 可通过 ids-txts 设置或 --ids-txt 添加到 zxdb 命令行 flag。

symbol-path

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

检查符号状态

sym-stat 命令会返回符号的状态。如果没有运行 过程中,它会返回您所拥有的不同符号位置的相关信息, 。如果找不到您的符号,请确保它与您的 预期。

如需查看符号的状态,请运行 sym-stat

[zxdb] 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 statusIndexed 列中看到 0,则表示 zxdb 找不到符号的来源。如果您无法调试 请提交 zxdb 错误

变量值不可用

Zxdb 可能会返回变量值方面的问题,在大多数情况下,这与 程序的优化级别。例如:

  • 优化输出:这表示程序符号声明了变量 具有给定的名称,但它没有值或位置。这表示 则编译器已完全优化了该变量,且调试程序无法 。如果需要查看该变量,请使用优化程度较低的构建设置。

  • 不可用:表示当前变量无效 但它在其他地址是已知的。在优化代码中, 编译器通常会重复使用寄存器,这会覆盖之前的值, 就会变为不可用状态

例如,您可以使用以下代码查看 my_variable 变量的有效范围: sym-info 命令:

[zxdb] 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 所找到文件的文件名。例如:

[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,请执行以下操作:

[zxdb] set show-file-paths true

设置断点时

在特定计算机上设置断点时,您可能会注意到源代码行不匹配 显示的断点位置与您的行号不匹配的行 。在大多数情况下,这是因为这些符号在 因此 zxdb 会使用下一行。即使是在 未优化的 build,最常用于变量声明。

[zxdb] 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) {