排解 zxdb 問題

本頁列出 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 套件伺服器正在執行

對於大部分的樹狀結構內建構設定,zxdb 使用的 debug_agent 位於宇宙依附元件集中,而非基礎依附元件集中,因此不會 在 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 可以透過這些指令列選項 其他符號查詢位置:

這些選項包含可透過 setget 調整的設定。

舉例來說,如要新增 .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 目錄。這個目錄中的符號檔案是 根據建構 ID 建立索引舉例來說, Fuchsia 版本包含 .build-id 目錄的建構目錄,例如out/x64/.build-id

這些目錄可以透過 build-id-dirs 設定或 --build-id-dir

ids-txt

有些建構作業不會產生 .build-id 目錄,而是產生一個名為 ids.txt 的檔案 ,其中會列出對應二進位檔的版本 ID 和本機路徑。這些檔案 可以透過 ids-txts 設定或 --ids-txt 新增至 zxdb 指令列旗標

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 版本會產生與建構目錄相關的符號。 相對路徑類似 ../../src/my_component/file.cc。建構目錄 通常是由符號索引提供,以便系統找出來源檔案。

如果找不到來源檔案,請手動設定來源 地圖設定。

舉例來說,如果偵錯工具找不到 ./../../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

來源行不符

有時候,來源檔案清單可能會與程式碼不相符。最常見的 原因是建構版本過舊,與來源不再相符。 偵錯工具會檢查符號檔案修改時間是否晚於來源 檔案,但只會在檔案首次顯示時列印警告。

部分使用者會多次結帳。搭配 list 指令使用 -f 選項 檢查 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 使用了下一行即使在 尚未最佳化的版本,最常見的用途是變數宣告。

[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) {