了解符号的加载方式

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 从上游软件包提取的预构建二进制文件中下载符号时,debuginfo 可能没有相应的 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 目录符号数据库

许多构建环境(包括主要的 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-statsym-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 文件。通常,您当前使用的每个构建环境都有一个从此全局文件引用的类似文件。

如果您在构建环境之间切换,并发现符号无法加载,请确保您的环境已使用 ffx debug symbol-index list 命令注册。