瞭解符號的載入方式

Zxdb 應會自動依環境設定符號設定。

本節說明 zxdb 載入符號的方式。如果想加以協助 來排解 zxdb 符號化工具的常見問題。詳情請參閱 診斷符號問題

版本 ID

Zxdb 使用二進位的 版本 ID

舉例來說,如要查看 Linux 二進位檔的建構 ID,請針對notes ELF 二進位檔:

$ 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 指令會顯示每個二進位檔和程式庫的版本 ID 附加在附加程序中目前載入的 Pod它也會顯示 對應的符號檔案 (如果有的話)。

符號伺服器

Zxdb 可以從 Google 伺服器或上游載入預建程式庫的符號 debuginfod 個伺服器。這是為 SDK 提供符號的機制 使用者進行了不在本機建構的任何應用程式。若需更多資訊,請參閲 下載符號

處理大型二進位檔時,符號可能會是幾 GB 下載過程可能需要一些時間 (通常在幾分鐘內)。 sym-stat 指令會在下載符號時顯示 Downloading...

zxdb 下載符號時,會將符號儲存在符號快取中。 symbol-cache 設定包含這個目錄的名稱。

例如:

[zxdb] 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 的標準目錄結構中。這個 目錄包含以前兩份命名的子目錄 二進位版本 ID 的字元。這些子目錄包含符號 依據版本 ID 其餘字元命名的檔案。

您可以在指令列中設定一或多個版本 ID 目錄,或是 透過 build-id-dirs 設定 (目錄清單) 以互動方式互動 路徑。

舉例來說,如要將 /home/alice/project/out/x64/.build-id 新增為 build-id-dirs

zxdb 執行個體

[zxdb] set build-id-dirs += /home/alice/project/out/x64/.build-id

ffx

ffx debug symbol-index add --build-dir /home/alice/project/out/x64/.build-id

然後,這些目錄在輸出內容中會加上 (folder) 註解 sym-stat,而非目錄中包含的二進位檔數量。 這些二進位檔不會顯示在 sym-stat --dump-index 輸出內容中,原因如下: zxdb 搜尋符號時,會視需要搜尋這些目錄 並事先列舉這些函式

個別檔案和目錄

只有單一二進位檔案,但不含其他符號資料庫 就能設定該特定檔案的 zxdb。您可以使用 特定檔案的 symbol-paths,方法是將其新增至路徑清單。

舉例來說,如要將 /home/alice/project/a.out 新增至 symbol-paths 設定:

檔案

[zxdb] set symbol-paths += /home/alice/project/a.out

目錄

[zxdb] set symbol-paths += /home/me/project/build/

您可以看到使用sym-stat設定的地點狀態 指令例如:

[zxdb] 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 的檔案。這個檔案 會從二進位檔的建構 ID 與本機上的符號路徑進行對應 有些人會將 Cloud Storage 視為檔案系統 但實際上不是如果您的版本產生這類檔案且並未自動載入, 您可透過 ids-txts 設定 (檔案名稱清單) 為 Zxdb 指定語言:

舉例來說,如要將 /home/alice/project/build/ids.txt 新增至 ids-txts 設定:

[zxdb] set ids-txts += /home/alice/project/build/ids.txt

當執行ids.txt sym-statsym-stat --dump-index 指令。

符號設定

先前提到的設定 瞭解 Zxdb 載入符號的方式一節 就會自動套用該環境本節將說明這些機制

symbol-index-files 設定包含一或多個 JSON 格式檔案, 是由開發環境設定:

[zxdb] get symbol-index-files
symbol-index-files =
  • /home/alice/.fuchsia/debug/symbol-index.json

這個檔案可能含有部分全域設定,並參照其他 symbol-index 檔案。一般來說,您使用的每個建構環境都有 從這個全域檔案參照的類似檔案。

在建構環境之間切換時,發現符號不會 載入資料,請確定您的環境已向 ffx debug symbol-index list 指令。