fidlcat:指南

啟動 fidlcat 並 並且會開始記錄已傳送的系統呼叫, 是透過 FIDL 接收的。

請查看以下 fidlcat 的基本輸出內容範例:

Monitoring echo_client.cm koid=193974

echo_client.cm 193974:193976 zx_channel_create(options: uint32 = 0)
  -> ZX_OK (out0: handle = d7e9f83b(channel:0), out1: handle = d6c9fd5f(channel:1))

範例輸出內容包含以下資訊:

  • echo_client.cm:產生此顯示器的程序名稱。

  • 193974:程序 koid。

  • 193976:執行緒 koid。

  • zx_channel_create:攔截/顯示系統呼叫的名稱。

  • 系統呼叫輸入參數 (例如 handleoptions), 名稱、類型和值

  • 系統呼叫傳回值 (ZX_OK) 和輸出參數

針對代表 FIDL 交易的系統呼叫,fidlcat 會顯示額外 輸入和輸出參數請參閱以下範例 fuchsia.examples/Echo.EchoString 要求:

echo_client.cm 193974:193976 zx_channel_call_etc(handle: handle = Channel:d089f8fb(dir:/svc/fuchsia.examples.Echo), options: uint32 = ZX_CHANNEL_WRITE_USE_IOVEC, deadline: zx.time = ZX_TIME_INFINITE, rd_num_bytes: uint32 = 64, rd_num_handles: uint32 = 64)
  sent request fuchsia.examples/Echo.EchoString = { value: string = "hello" }
  -> ZX_OK
    received response fuchsia.examples/Echo.EchoString = { response: string = "hello" }

請注意顯示輸出內容中的 FIDL 要求和回應訊息,包括 方法名稱和參數

修改顯示畫面

根據預設,fidlcat 只會在 。使用 --with-process-info 旗標,在以下位置加入這些詳細資料: 每一行:

echo_client.cm 60014:60016 zx_channel_call_etc(handle: handle = Channel:35272afb(dir:/svc/fuchsia.examples.Echo), options: uint32 = ZX_CHANNEL_WRITE_USE_IOVEC, deadline: zx.time = ZX_TIME_INFINITE, rd_num_bytes: uint32 = 64, rd_num_handles: uint32 = 64)
echo_client.cm 60014:60016   sent request fuchsia.examples/Echo.EchoString = { value: string = "hello" }
echo_client.cm 60014:60016   -> ZX_OK
echo_client.cm 60014:60016     received response fuchsia.examples/Echo.EchoString = { response: string = "hello" }

堆疊框架

使用 --stack 旗標可顯示每個系統的堆疊框架 呼叫。根據預設 (--stack=0),系統不會顯示堆疊框架。

使用 --stack=1 時,系統只會顯示呼叫站點 (1 到 4 個影格):

echo_client.cm 675407:675409 at zircon/system/ulib/fidl/llcpp_message.cc:243:12 fidl::OutgoingMessage::CallImpl
echo_client.cm 675407:675409 zx_channel_call_etc(handle: handle = Channel:8b745347(dir:/svc/fuchsia.examples.Echo), options: uint32 = ZX_CHANNEL_WRITE_USE_IOVEC, deadline: zx.time = ZX_TIME_INFINITE, rd_num_bytes: uint32 = 64, rd_num_handles: uint32 = 64)
  sent request fuchsia.examples/Echo.EchoString = { value: string = "hello" }
  -> ZX_OK
    received response fuchsia.examples/Echo.EchoString = { response: string = "hello" }

這個選項不會增加任何負擔 (顯示畫面除外)。

--stack=2 的情況下,所有影格都會顯示:

echo_client.cm 717533:717535 at 3ac285b4811 _start
echo_client.cm 717533:717535 at zircon/third_party/ulib/musl/src/env/__libc_start_main.c:215:5 __libc_start_main
echo_client.cm 717533:717535 at zircon/third_party/ulib/musl/src/env/__libc_start_main.c:140:3 start_main
echo_client.cm 717533:717535 at examples/fidl/llcpp/client_sync/main.cc:30:27 main
echo_client.cm 717533:717535 at fidling/gen/examples/fidl/fuchsia.examples/fuchsia.examples/llcpp/fidl/fuchsia.examples/cpp/wire_messaging.h:2711:12 fidl::internal::WireSyncClientImpl<fuchsia_examples::Echo>::EchoString
echo_client.cm 717533:717535 at fidling/gen/examples/fidl/fuchsia.examples/fuchsia.examples/llcpp/fidl/fuchsia.examples/cpp/wire_messaging.cc:1051:12 fidl::WireResult<fuchsia_examples::Echo::EchoString>::WireResult
echo_client.cm 717533:717535 at zircon/system/ulib/fidl/include/lib/fidl/llcpp/message.h:205:3 fidl::OutgoingMessage::Call<fidl::WireResponse<fuchsia_examples::Echo::EchoString>, zx::unowned<zx::channel> >
echo_client.cm 717533:717535 at zircon/system/ulib/fidl/include/lib/fidl/llcpp/message.h:196:5 fidl::OutgoingMessage::Call<fidl::WireResponse<fuchsia_examples::Echo::EchoString> >
echo_client.cm 717533:717535 at zircon/system/ulib/fidl/llcpp_message.cc:243:12 fidl::OutgoingMessage::CallImpl
echo_client.cm 717533:717535 zx_channel_call_etc(handle: handle = Channel:f751d2fb(dir:/svc/fuchsia.examples.Echo), options: uint32 = ZX_CHANNEL_WRITE_USE_IOVEC, deadline: zx.time = ZX_TIME_INFINITE, rd_num_bytes: uint32 = 64, rd_num_handles: uint32 = 64)
  sent request fuchsia.examples/Echo.EchoString = { value: string = "hello" }
  -> ZX_OK
    received response fuchsia.examples/Echo.EchoString = { response: string = "hello" }

這個選項會增加負擔,因為我們必須要求 zxdb 來取得完整堆疊 ,而 fidlcat 會更完整。應使用 只有在您需要瞭解程式碼的哪些部分稱為系統呼叫時,才需要付費。

篩選輸出內容

Syscalls

根據預設,fidlcat 只會顯示 zx_channel 系統呼叫。 --syscalls 選項可讓您定義選取的規則運算式 以便解碼並顯示內容

如要顯示所有系統呼叫,請使用 --syscalls=".\*"

--exclude-syscalls 旗標會定義要排除的一般到期時間 來自 --syscalls 所選集合的系統呼叫。

系統呼叫必須符合 --syscalls 模式,才能顯示 滿足 --exclude-syscalls 模式。

以下範例顯示所有 Syscall,但 zx_handle 除外

--syscalls ".\*" --exclude-syscalls "zx_handle_.\*"

訊息

根據預設,fidlcat 會顯示所有訊息。 您可以使用下列方式指定要顯示的訊息:

  • --messages 可讓您指定一或多個規則運算式 訊息必須符合這些條件才會顯示。

  • --exclude-messages 可讓您指定一或多個規則運算式 訊息不符合顯示條件

如果同時使用這兩種選項,要顯示的訊息必須 符合其中一個使用 --messages 指定的規則運算式 符合任何使用 --exclude-messages 指定的規則運算式。

訊息篩選適用於方法的完整名稱。例如: 下列標記:

--messages=".*Open"

比對方法包括:

fuchsia.io/Directory.Open
fuchsia.io/Node.OnOpen

執行緒

使用 --thread=<thread koid> 選項時,只有指定中的事件 執行緒之間的關係。這個選項可用於多次顯示 。

分組輸出內容

通訊協定

使用 --with=top--with=top=<path> 選項即可產生 會依程序、通訊協定和方法將輸出內容分組。群組排序依據 事件數,因此相關事件較多的群組會較早顯示。

執行緒

使用 --with=group-by-thread--with=group-by-thread=<path> 選項,即可 會產生檢視畫面,顯示每個執行緒的所有事件簡短版。

延後顯示訊息

根據預設,fidlcat 會在附加完成後立即開始顯示訊息 加入一些計畫

您可以使用 --trigger 選項延後顯示畫面,直到提供 規則運算式比對收到的郵件。

如果在參閱之後需要瞭解情況,這個就能派上用場 或發出特定訊息

摘要檢視

設定 fidlcat 以顯示工作階段的概要摘要,而非顯示 列出個別訊息,請使用選項 --with=summary--with=summary=<path>

echo_client.cm 1505832: 16 handles

  Process:ac4ce043(proc-self)

  startup Vmar:a43cfe53(vmar-root)

  startup Thread:d5dce00f(thread-self)

  startup Channel:91cce2f3(dir:/svc)
      write request  fuchsia.io/Directory.Open(".")
        -> Channel:c65ce1c3(dir:/svc)

  startup Channel:daece3fb(dir:/pkg)

  startup Socket:cb8ce31f(fd:1)
    closed by zx_handle_close

  startup Socket:df8ce687(fd:2)
    closed by zx_handle_close

  startup Channel:93ccfcf7(directory-request:/)

  startup Clock:b7ecfe9b()

  startup Job:674ce17f(job-default)

  startup Vmo:adbcfc9f(vdso-vmo)

  startup Vmo:ef2ce06f(stack-vmo)

  Channel:c65ce1c3(dir:/svc)
    linked to Channel:da9cebcb(channel:1)
    created by zx_channel_create
      write request  fuchsia.io/Directory.Open("fuchsia.examples.Echo")
        -> Channel:767ce3f3(dir:/svc/fuchsia.examples.Echo)
    closed by zx_handle_close

  Channel:da9cebcb(channel:1)
    linked to Channel:c65ce1c3(dir:/svc)
    created by zx_channel_create
    closed by Channel:91cce2f3(dir:/svc) sending fuchsia.io/Directory.Open

  Channel:767ce3f3(dir:/svc/fuchsia.examples.Echo)
    linked to Channel:f4bce307(channel:3)
    created by zx_channel_create
      call  request  fuchsia.examples/Echo.EchoString
      write request  fuchsia.examples/Echo.SendString
      read  event    fuchsia.examples/Echo.OnString
    closed by zx_handle_close

  Channel:f4bce307(channel:3)
    linked to Channel:767ce3f3(dir:/svc/fuchsia.examples.Echo)
    created by zx_channel_create
    closed by Channel:c65ce1c3(dir:/svc) sending fuchsia.io/Directory.Open

這裡會列出所有受監控的處理程序、帳號代碼和管道 課程中會有詳細說明

  • 帳號代碼:帳號代碼是否為啟動帳號代碼 (在活動期間沿用 程序建立) 或建立。 如果是非啟動控點,fidlcat 也會顯示 用來建立和關閉每個帳號代碼的系統呼叫。

  • 聲道:顯示 以及收發的 FIDL 訊息清單。

持續監控

根據預設,fidlcat 工作階段會在所有附加的程序終止時終止 結束。

使用 --stay-alive 選項,即可讓工作階段保持運作,直到手動為止 結束 fidlcat (例如使用 Ctrl-C 鍵)。

這可以讓您在相同的監控內多次重新啟動程式 會很有幫助每次重新啟動時,fidlcat 工作階段都會附加至新程序 。