本頁列出 zxdb 的常見疑難排解提示:
- 確認已建構 zxdb 和
debug_agent - 確認 ffx 可以與裝置通訊
- 確認 Fuchsia 套件伺服器正在執行
- 診斷符號問題
- 確認 debug_agent 的套件放送功能是否正常運作
- 檢查偵錯工具元件是否存在
確認 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 位於 universe 依附元件集中,但不在基本依附元件集中,因此不會在啟動前位於 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 提供下列指令列選項,可提供額外的符號查詢位置:
這些選項的設定可透過 set 或 get 操控。
舉例來說,如要新增 .build-id 目錄,您可以採取下列任一做法:
設定 build-id-dirs
set build-id-dirs += some/other_location/.build-id
--build-id-dir 旗標
ffx debug connect -- --build-id-dir some/other_location/.build-idbuild-id-dir
部分建構作業會產生 .build-id 目錄。這個目錄中的符號檔案會依據版本 ID 編製索引。舉例來說,Fuchsia 建構作業會在建構目錄中建立 .build-id 目錄,例如 out/x64/.build-id。
您可以透過 build-id-dirs 設定或 --build-id-dir,將這些目錄新增至 zxdb。
ids-txt
部分建構作業會產生名為 ids.txt 的檔案,列出建構 ID 和對應二進位檔的本機路徑,而非 .build-id 目錄。您可以透過 ids-txts 設定或 --ids-txt 指令列旗標,將這些檔案新增至 zxdb。
symbol-path
--symbol-path 旗標可用來將任意檔案或目錄新增至符號索引。如果路徑指向檔案,zxdb 會將其視為 ELF 檔案,並加入符號索引。如果是目錄,系統會為指定路徑下的所有二進位檔建立索引。
查看符號狀態
sym-stat 指令會傳回符號的狀態。如果沒有正在執行的程序,則會傳回您指定的不同符號位置資訊。如果找不到符號,請確認這是否符合您的預期。
如要查看符號狀態,請執行 sym-stat:
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 可能會傳回變數值相關問題,這類問題通常與程式的最佳化層級有關。例如:
已最佳化:這表示程式符號會使用指定名稱宣告變數,但該變數沒有值或位置。這表示編譯器已完全最佳化變數,因此偵錯工具無法顯示該變數。如需查看變數,請使用最佳化程度較低的建構設定。
無法使用:表示變數在目前位址無效,但在其他位址的值已知。在最佳化程式碼中,編譯器通常會重複使用暫存器,這可能會覆寫先前的值,導致這些值無法使用。
舉例來說,您可以使用 sym-info 指令查看 my_variable 變數的有效範圍:
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 找到的檔案名稱。例如:
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,請執行下列操作:
set show-file-paths true
設定中斷點時
在特定程式碼行上設定中斷點時,您可能會發現來源程式碼行不符,因為顯示的中斷點位置與您輸入的行號不符。在大多數情況下,這是因為這些符號未識別指定行上的任何程式碼,因此 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) {
確認 debug_agent 的套件放送功能正常運作
如果懷疑 debug_agent 套件無法提供服務,請檢查 Fuchsia 結帳設定,確認套件服務是否正常運作。
直接在裝置殼層上使用 pkgctl 解決套件問題:
針對
debug_agent套件執行resolve指令,例如:fx shell pkgctl resolve fuchsia-pkg://fuchsia.com/debug_agent如要確認套件是否已成功解析,請檢查套件解析器統計資料:
ffx inspect show core/pkg-resolver:root/resolver_service/successful_resolves找出
source = TUF和debug_agent套件雜湊與 Fuchsia 來源結帳設定中out/default/amber-files/repository/targets.json檔案值相符的項目。
檢查偵錯工具元件是否存在
如果在設定 zxdb 時 ffx debug connect 指令失敗,請使用 ffx component list 指令檢查目標裝置上是否確實有 debugger 元件,例如:
ffx component list | grep debugger這個指令必須傳回 core/debugger,ffx debug connect 才能運作。