設定及執行 zxdb、Fchsia's 偵錯工具,使用 C++ 和 Rust 程式碼

在 Fuchsia 上啟動 zxdb,非常簡單:

ffx debug connect

偵錯工具啟動後,應該會顯示

Connecting (use "disconnect" to cancel)...
Connected successfully.
👉 To get started, try "status" or "help".
[zxdb]

無論您是使用模擬器或硬體裝置,只要有 95% 時間會正常運作,如果無法正常運作,請查看下方的疑難排解。

疑難排解

建構類型相容

Fuchsia 中的 Debugger 依附於具有特殊權限的系統呼叫,其中最值得注意的是 zx_process_write_memory。只有在核心標記 kernel.enable-debugging-syscalls 設為 true 時,系統才會啟用這些系統呼叫,這表示 useruserdebug 建構類型無法使用偵錯工具。

如果是從來源建構,這些系統呼叫很可能會啟用。

已建構 zxdb 和 debug_agent

Zxdb 取決於名為 debug_agent 的目標端元件。如果錯誤訊息顯示「The plugin service selector 'core/debug_agent:公開:fuchsia.debugger.DebugAgent' doesn't matching the target on 目標上的任何服務」,表示尚未建構 debug_agent。您也可以查看建構目錄中是否有 debug_agenthost_x64/zxdb

如果版本沒有偵錯工具,請將 //bundles/tools 新增至「宇宙」,使用下列任一方式:

fx <normal_stuff_you_use> --with //bundles/tools

或者,您也可以編輯 <build_dir>/args.gn 並加到底部,直接編輯 GN 引數:

universe_package_labels += [ "//bundles/tools" ]

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]

套件伺服器正在執行

在大多數建構設定中,偵錯代理程式都會位於「宇宙」(即「可供使用」) 中,但不會在基礎版本內,因此系統不會在啟動前於系統上執行。您必須執行:

fx serve

已註冊偵錯符號

根據預設,Zxdb 會從符號索引取得偵錯符號的位置。樹狀結構內和大部分樹狀結構外的偵錯符號均會自動註冊。如果問題仍未解決,zxdb 有三個指令列旗標,用於為 zxdb 提供額外的符號查詢位置:--build-id-dir--ids-txt 和一般 --symbol-path。這些元件都有相應的設定,可以使用 setget 處理。

舉例來說,如要新增「.build-id」目錄,請使用 --build-id-dir 標記:

ffx debug connect -- --build-id-dir some/other_location/.build-id

或者將其新增至互動式 UI 的 build-id-dirs 清單選項:

[zxdb] set build-id-dirs += some/other_location/.build-id

針對樹狀結構內開發,ffx debug connect 會自動設定所有必要的標記。

build-id-dir

某些建構會產生 .build-id 目錄。系統已根據版本 ID 為檔案中的符號檔案建立索引。例如,Fchsia 版本本身會在建構目錄內建立 .build-id 目錄,例如:out/x64/.build-id:您可以透過 --build-id-dir 指令列旗標或 build-id-dirs 設定,將 zxdb 新增至 zxdb。這是最好的方法。

ids-txt

某些建構會產生名為 ids.txt 的檔案,而非 .build-id 目錄,其中會列出對應二進位檔的建構 ID 和本機路徑。您可以透過 --ids-txt 指令列旗標或 ids-txts 設定,將參數新增至 zxdb。因此,這是第二項最佳做法。

symbol-path

另外,--symbol-path 旗標可用來將任意檔案或目錄新增至符號索引。如果路徑指向檔案,系統會將其視為 ELF 檔案並新增至符號索引。 如果是目錄,系統會將指定路徑下的所有二進位檔編入索引。

原始碼位置已正確設定

Fuchsia 建構會產生相對於建構目錄的符號,因此相對路徑看起來像 ../../src/my_component/file.cc。建構目錄通常是由符號索引提供,因此來源檔案可以位於這個位置。

如果找不到檔案,請手動調整來源對應設定。舉例來說,如果偵錯工具找不到 ./../../src/my_component/file.cc,且檔案位於 /path/to/fuchsia/src/my_component/file.cc,您可以

[zxdb] set source-map += ./../..=/path/to/fuchsia

因此偵錯工具會改為尋找 /path/to/fuchsia/src/my_component/file.cc。如需進一步協助,請查看 get source-map