fidlcat:監控及偵錯通話

簡介

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

啟用

fidlcat 工具隨附於 SDK 中。在 fuchsia.git 中,叫用 fx build 會自動建構。

如要執行 fidlcat,您必須為 Fuchsia 目標啟用網路。在啟用網路的情況下啟動模擬器。按照操作說明在 FEMU 頁面上啟動具外部網路的模擬器

執行

當您正確設定環境且建構 fidlcat 時,應可使用該環境監控來自目標程序的 FIDL 訊息。有幾種方法可以完成此操作。請注意,您必須透過 ffx debug fidl 指令叫用 fidlcat,因為這個指令會自動設定網路通道,並尋找某些必要的成果 (例如偵錯符號)。

附加至執行中的程序

如果您在殼層中執行 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

啟動時附加至程式

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

ffx debug fidl --remote-name echo_client

混合用途

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

當 --remote-name 和 run 搭配使用時,只會監控相符的 --remote-name 程序。

範例 (echo_server 由 echo_client 啟動):

執行並監控 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> 播放。使用這個選項時,fidlcat 會重播先前以 --to=<path> (protobuf 格式) 儲存的工作階段。

工作階段儲存

選項 --to=<path> 工作階段會儲存至指定檔案 (二進位 protobuf 格式)。 儲存工作階段後,您可以使用「--from=<path>」重播工作階段。系統會儲存原始資料。 這表示儲存的資料與顯示的內容是各自獨立的。

格式 (輸出) 選項

您有下列的輸出選項:

  • --format=fit 此為預設的輸出內容。會議內容美觀排版 (包含不同顏色)。

  • --format=json 以 JSON 格式輸出工作階段。

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

  • --format=summary 會在工作階段結束時顯示工作階段的摘要。

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

疑難排解

如果無法順利執行 ffx debug fidl,請參閱 zxdb 的疑難排解指南

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

  • 首先,您需要在執行檔中加入符號。在實際操作時,如果您樹狀結構內執行,這些符號應會自動提供給 fidlcat。或者,您可以使用 --build-id-dir 旗標提供 .build-id 目錄,也可以 b) 使用 --ids-txt 標記的 ids.txt 檔案,或 c) 使用 --symbol-path 旗標提供任意 ELF 檔案或 ELF 檔案目錄。您可以合併及指定這些標記多次。

  • 其次,它需要對擷取的 FIDL 進行中繼表示法,以便產生可讀取的輸出內容。如果您是樹狀結構內執行,則應自動提供 IR 給 fidlcat。否則,您可以提供 IR 路徑,這可以是明確的 IR 檔案路徑、會掃描 IR 檔案的目錄,或是含有明確路徑的引數檔案。這可以透過 --fidl-ir-path 標記提供。引數檔案的前面必須加上 @ 字元:--fidl-ir-path @argfile

還有其他疑慮的開發人員可以回報錯誤。請使用「Tools」>「fidlcat」元件

閱讀指南

fidlcat 指南說明修改輸出內容的所有標記。也會列舉幾個畫面解讀方式的例子。

驗證碼在哪裡?

這個驗證碼位於 //tools/fidlcat