瞭解符號的載入方式

Zxdb 應會根據您的環境自動設定符號。

本節說明 zxdb 如何載入符號。如要瞭解如何排解 zxdb 符號化工具的常見問題,請參閱「診斷符號問題」。

版本 ID

Zxdb 會使用二進位檔的建構 ID,找出目標裝置上二進位檔的符號。

舉例來說,如要在 Linux 上查看二進位檔的建構 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 指令會顯示每個二進位檔的建構 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 的標準目錄結構中新增符號化二進位檔。這個目錄包含依據二進位檔建構 ID 的前兩個字元命名的子目錄。這些子目錄包含根據建構 ID 剩餘字元命名的符號檔案。

您可以在指令列上設定一或多個建構 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 新增至路徑清單,藉此設定特定檔案的 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 的檔案。這個檔案會將二進位檔的版本 ID 對應至本機系統上的符號路徑。如果您的版本產生此類檔案,但未自動載入,您可以使用 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 指令註冊。