本頁列出 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 可以透過這些指令列選項 其他符號查詢位置:
這些選項包含可透過 set
或 get
調整的設定。
舉例來說,如要新增 .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) {