Zxdb 应根据您的环境自动设置符号。
本部分介绍了 zxdb 如何加载符号。如果您想了解如何排查 zxdb 符号器的常见问题,请参阅诊断符号问题。
build ID
Zxdb 通过使用二进制文件的build ID 来查找目标设备上二进制文件的符号。
例如,如需查看 Linux 上某个二进制文件的 build ID,请转储 ELF 二进制文件的 notes:
$ readelf -n my_binary
... (some other notes omitted) ...
Displaying notes found in: .note.gnu.build-id
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build ID: 18cec080fc47cdc07ec554f946f2e73d38541869
sym-stat zxdb 命令会显示每个二进制文件的 build ID 以及当前加载到附加进程中的库。如果找到相应的符号文件,还会显示该文件。
符号服务器
Zxdb 可以从 Google 服务器或上游 debuginfod 服务器加载预构建库的符号。这是向 SDK 用户交付非本地构建的任何内容的符号的机制。如需了解详情,请参阅下载符号。
处理大型二进制文件时,符号可能达到几 GB,因此下载过程可能需要一些时间(通常在几分钟内)。
sym-stat 命令在下载符号时显示 Downloading...。
当 zxdb 下载符号时,会将它们存储在符号缓存中。symbol-cache 设置包含此目录的名称。
例如:
get symbol-cache
symbol-cache = /home/me/.fuchsia/debug/symbol-cache
当 zxdb 从上游软件包提取的预构建二进制文件中下载符号时,调试信息可能没有相应的 ELF 二进制文件(具体取决于服务器和软件包)。如果发生这种情况,zxdb 可能会显示如下所示的错误:
...
binary for build_id 26820458adaf5d95718fb502d170fe374ae3ee70 not found on 5 servers
binary for build_id 53eaa845e9ca621f159b0622daae7387cdea1e97 not found on 5 servers
binary for build_id f3fd699712aae08bbaae3191eedba514c766f9d2 not found on 5 servers
binary for build_id 4286bd11475e673b194ee969f5f9e9759695e644 not found on 5 servers
binary for build_id 2d28b51427b49abcd41dcf611f8f3aa6a2811734 not found on 5 servers
binary for build_id 0401bd8da6edab3e45399d62571357ab12545133 not found on 5 servers
...
这表示在 debuginfod 服务器上未找到 ELF 二进制文件。 在这种情况下,ELF 符号不适用于此特定二进制文件,这通常不会影响大多数调试场景。最常用的可能不可用的 ELF 特定符号是 PLT 符号。
您可以使用 sym-stat 命令验证 DWARF 信息是否已加载:
libc.so.6
Base: 0x1c85fdc2000
Build ID: 0401bd8da6edab3e45399d62571357ab12545133
Symbols loaded: Yes
Symbol file: /home/alice/.fuchsia/debug/symbol-cache/04/01bd8da6edab3e45399d62571357ab12545133.debug
Source files indexed: 1745
Symbols indexed: 10130
.build-id 目录符号数据库
许多 build 环境(包括主 fuchsia.git 代码库)都会在名为 .build-id 的标准目录结构中添加符号化二进制文件。此目录包含的子目录的名称根据二进制文件的 build ID 的前两个字符命名。这些子目录包含根据 build ID 的剩余字符命名的符号文件。
您可以在命令行上设置一个或多个 build ID 目录,也可以通过交互方式使用 build-id-dirs 设置(目录路径列表)来设置。
例如,如需将 /home/alice/project/out/x64/.build-id 添加为 build-id-dirs,请执行以下操作:
zxdb 实例
set build-id-dirs += /home/alice/project/out/x64/.build-id
ffx
ffx debug symbol-index add out/default/.build-id然后,在 sym-stat 的输出中,这些目录会使用 (folder) 进行注释,而不是使用目录中包含的二进制文件数量进行注释。这些二进制文件不会显示在 sym-stat --dump-index 输出中,因为 zxdb 在搜索符号时会按需搜索这些目录,而不是提前枚举它们。
单个文件和目录
如果您只有一个二进制文件,而没有其他符号数据库格式,则可以为该特定文件配置 zxdb。您可以通过将特定文件的 symbol-paths 添加到路径列表中来配置该文件。
例如,如需将 /home/alice/project/a.out 添加到 symbol-paths 设置中,请使用以下代码:
文件
set symbol-paths += /home/alice/project/a.out
目录
set symbol-paths += /home/me/project/build/
您可以使用 sym-stat 命令查看已配置的位置的状态。例如:
sym-stat
Symbol index status
This command just refreshed the index.
Use "sym-stat --dump-index" to see the individual mappings.
Indexed Source path
1 /home/alice/a.out
2 /home/alice/project/build/
ids.txt 符号索引
一些较旧的内部 Google 项目会生成一个名为 ids.txt 的文件。此文件提供从二进制文件的 build ID 到本地系统上符号路径的映射。如果您的 build 生成了此类文件,但该文件未自动加载,您可以使用 ids-txts 设置(文件名列表)为 Zxdb 指定该文件:
例如,如需将 /home/alice/project/build/ids.txt 添加到 ids-txts 设置中,请使用以下代码:
set ids-txts += /home/alice/project/build/ids.txt
运行 sym-stat 或 sym-stat --dump-index 命令时,系统还会显示来自 ids.txt 文件的符号文件。
符号设置
了解 Zxdb 如何加载符号部分中所述的设置会自动由您的环境应用。本部分介绍了如何设置这些设置。
symbol-index-files 设置包含由开发环境设置的一个或多个 JSON 格式的文件:
get symbol-index-files
symbol-index-files =
• /home/alice/.fuchsia/debug/symbol-index.json
此文件可以包含一些全局设置,并引用其他 symbol-index 文件。通常,您正在积极使用的每个构建环境都有一个类似的文件,该文件会从此全局文件引用。
如果您在不同的 build 环境之间切换,并发现符号未加载,请确保您的环境已通过 ffx debug symbol-index list 命令注册。