本页面列出了 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 可通过这些命令行选项 其他符号查找位置:
这些选项包含可使用 set
或 get
控制的设置。
例如,如需添加 .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 status
的 Indexed
列中看到 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) {