本頁列出 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 位於通用依附元件集中,但不在基本依附元件集中,因此在啟動前不會位於 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 (ffx.log) in directory:
<directory>
To inspect, run: tail -f "<directory>/ffx.log"
如果看到這類錯誤,請確認 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
部分版本不會產生 .build-id 目錄,而是產生名為 ids.txt 的檔案,其中列出版本 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 bootstrap/pkg-cache:root/fuchsia.pkg.PackageResolver-full/recent尋找
authority = "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 才能運作。