fidlcat:監控及偵錯通話

總覽

fidlcat 可供使用者監控 FIDL 連線。目前,這項工具可以附加至 Fuchsia 裝置上的程序或啟動程序,並回報 FIDL 流量。

啟用

SDK 內含 fidlcat 工具。在 fuchsia.git 中,呼叫 fx build 會自動建構該項目。

如要執行 fidlcat,必須在 Fuchsia 目標上啟用網路功能。如要啟動已啟用網路的模擬器,按照操作說明啟動模擬器,並在 FEMU 頁面上存取外部網路

執行

環境設定正確且 fidlcat 建構完成後,您應該就能使用這項工具監控目標程序中的 FIDL 訊息。方法有很多種,請注意,fidlcat 必須透過 ffx debug fidl 指令叫用,該指令會自動設定網路通道,並找出部分必要構件 (例如偵錯符號)。

附加至執行中的程序

如果在殼層中執行 ps 指令,即可取得要監控的 PID,然後執行:

ffx debug fidl --remote-pid <pid>

如果程式碼是由執行元件執行,您可能想附加至執行元件。如果是 Dart JIT 執行的程式碼,請在目標上執行 ps,然後尋找名為 dart_jit_runner 的程序:

host$ fx shell ps
[...]
        j:21102           17.6M   17.6M
          p:21107         17.6M   17.6M     32k         dart_jit_runner.cm

然後直接附加至該程序,並查看 Dart 程式傳送的所有 FIDL 訊息:

host$ ffx debug fidl --remote-pid 21107

您可以多次使用 --remote-pid 旗標,連線至多個程序:

ffx debug fidl --remote-pid <pid1> --remote-pid <pid2>

使用 fidlcat 啟動元件

或者,您也可以使用元件的網址直接啟動元件:

ffx debug fidl -- run fuchsia-pkg://fuchsia.com/echo_client_rust#meta/echo_client_rust.cm

您也可以使用 Bash 正規運算式指定網址,比對建構作業已知的專屬網址:

ffx debug fidl -- run "echo_client_cpp_synchronous.*"
ffx debug fidl -- run echo_client_cpp.cm

在啟動時附加至程式

您也可以將程式名稱的 regex 傳遞至 FiddlerCat 會附加至所有目前正在執行,以及後續啟動且符合規則運算式的程式。如果發出下列指令,fidlcat 會連線至系統,並附加至含有子字串「echo_client」的所有程式。

ffx debug fidl --remote-name echo_client

混合用途

--remote-pid、--remote-name 和 run 這三個選項可以一起使用。 不過,執行作業一律必須是最後一個。

同時使用 --remote-name 和 run 時,系統只會監控符合 --remote-name 的程序。

範例 (echo_client 會啟動 echo_server):

執行並監控 echo_client。 sh ffx debug fidl -- run echo_client_cpp.cm

執行並監控 echo_client。 sh ffx debug fidl --remote-name echo_client -- run echo_client_cpp.cm

執行 echo_client 並監控 echo_server。 sh ffx debug fidl --remote-name echo_server -- run echo_client_cpp.cm

執行 echo_client,並監控 echo_client 和 echo_server。 sh ffx debug fidl --remote-name echo -- run echo_client_cpp.cm

執行 echo_client,並監控 echo_client 和 echo_server。 sh ffx debug fidl --remote-name echo_client --remote-name echo_server -- run echo_client_cpp.cm

監控服務

如要監控服務,請使用 --extra-name,而非 --remote-name。--extra-name 選項也會監控部分程序。不過,對於這些程序,只有在啟動其中一個「--remote-name」程序時,才會開始監控。此外,最後一個「--remote-name」程序停止時,fidlcat 也會停止 (即使仍監控某些「--extra-name」程序)。

ffx debug fidl --remote-name echo --extra-name archivist -- run echo_client_cpp.cm

輸入選項

你可以透過兩種方式輸入:

  • --from=device:這是預設選項,可即時監控裝置。

  • --from=<path> Playback. 使用這個選項時,fidlcat 會重播先前使用 --to=<path> (protobuf 格式) 儲存的工作階段。

儲存工作階段

--to=<path> 選項:將工作階段儲存至指定檔案 (二進位 protobuf 格式)。儲存工作階段後,您可以使用「--from=<path>」重新播放。系統會儲存原始資料。也就是說,儲存的資料與顯示的資料無關。

格式 (輸出) 選項

輸出選項如下:

  • --format=pretty:這是預設輸出格式。工作階段會以彩色格式列印。

  • --format=json:以 JSON 格式列印工作階段。

  • --format=textproto:以文字 protobuf 格式列印工作階段。

  • --format=summary 課程結束時,系統會顯示課程摘要。

  • --format= 標準輸出內容不會顯示任何內容 (只有與 --to=<path> 搭配使用時,這個選項才有意義)。沒有輸出內容時,fidlcat 的速度會快很多 (如果您想監控即時元件,這是較好的做法)。

疑難排解

如果執行 ffx debug fidl 時發生問題,請參閱 zxdb 疑難排解指南

fidlcat 工具需要兩個資訊來源才能運作。如果缺少任一項,您就無法解碼 fidl 訊息:

  • 首先,它需要可執行檔的符號。在實務中,如果您在樹狀結構內執行,符號應會自動提供給 fidlcat。否則,您可以透過下列方式提供 fidlcat:a) 使用 --build-id-dir 旗標的 .build-id 目錄;b) 使用 --ids-txt 旗標的 ids.txt 檔案;或 c) 使用 --symbol-path 旗標的任意 ELF 檔案或 ELF 檔案目錄。這些標記可以合併使用,且可多次指定。

  • 其次,它需要所擷取 FIDL 的中繼表示法,才能產生可讀的輸出內容。如果您在樹狀結構內執行,系統應會自動將 IR 提供給 fidlcat。否則,您可以為 fidlcat 提供 IR 路徑,這可以是明確的 IR 檔案路徑、要掃描 IR 檔案的目錄,或是包含明確路徑的引數檔案。您可以使用 --fidl-ir-path 旗標將這項資訊提供給 fidlcat。引數檔案開頭必須加上 @ 字元:--fidl-ir-path @argfile

如有其他疑慮,開發人員可以回報錯誤。使用「工具」>「fidlcat」<0x0A>元件。

閱讀指南

fidlcat 指南說明瞭所有可修改輸出的標記。此外,也提供一些顯示解讀範例。

驗證碼在哪裡?

程式碼位於 //tools/fidlcat 中。