本頁說明如何在 Fuchsia 系統中註冊新的追蹤記錄提供者。
如要參與追蹤,新的追蹤供應商必須在 Fuchsia 追蹤系統中向追蹤管理員註冊。(不過,由於 devhost 程序會透過 libdriver.so 執行這項操作,因此驅動程式不必註冊為追蹤記錄供應商)。
如要註冊追蹤記錄供應器,請按照下列步驟操作:
向追蹤管理工具註冊元件
如要將元件註冊為追蹤記錄提供者,可以使用 libtrace-provider 程式庫,在元件的程式碼中提供非同步迴圈。
請參閱以下範例:
C++
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/trace-provider/provider.h>
// further includes
int main(int argc, const char** argv) {
// process argv
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
trace::TraceProviderWithFdio trace_provider(
loop.dispatcher(), "my_trace_provider");
// further setup
loop.Run();
return 0;
}
C
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/trace-provider/provider.h>
int main(int argc, char** argv) {
zx_status_t status;
async_loop_t* loop;
trace_provider_t* trace_provider;
// Create a message loop.
status = async_loop_create(&kAsyncLoopConfigNoAttachToCurrentThread, &loop);
if (status != ZX_OK) exit(1);
// Start a thread for the loop to run on.
// Alternatively, use async_loop_run() to run on the current thread.
status = async_loop_start_thread(loop, "loop", NULL);
if (status != ZX_OK) exit(1);
// Create the trace provider.
async_dispatcher_t* dispatcher = async_loop_get_dispatcher(loop);
trace_provider = trace_provider_create(dispatcher);
if (!trace_provider) exit(1);
// Do something...
// Tear down.
trace_provider_destroy(trace_provider);
async_loop_shutdown(loop);
return 0;
}
荒漠油廠
fn main() {
fuchsia_trace_provider::trace_provider_create_with_fdio();
// ...
}
設定能力轉送
如要讓元件要求適當的追蹤功能,請在元件資訊清單 (.cml) 中加入下列欄位:
{
include: [
"trace/client.shard.cml",
],
...
}
這樣一來,元件就能使用 fuchsia.tracing.provider.Registry 通訊協定與追蹤管理工具通訊,並將提案轉送給直接子項。如果您的元件是另一個元件的子項,您也需要在每個父項的 CML 中加入 client.shard.cml。
如果您的元件使用以 Chromium 為基礎的 fuchsia.web 服務,且您想從中收集追蹤資料,則必須為 Context 提供 fuchsia.tracing.provider.Registry 和 fuchsia.tracing.perfetto.ProducerConnector 功能。(如要瞭解功能如何傳遞至 Context,請參閱 fuchsia.web/CreateContextParams.service_directory)。
將元件註冊為追蹤記錄供應商後,即可在程式碼中啟用追蹤記錄。詳情請參閱下一頁「在程式碼中加入追蹤功能」。