如要進行追蹤,您可以使用下列程式庫:
- libtrace-provider:追蹤記錄供應商程式庫
- libtrace:C 和 C++ 追蹤事件程式庫
- fuchsia_trace:Rust Crate
- libtrace-Reader:Trace 讀取器程式庫
libtrace-provider:追蹤記錄供應商程式庫
這個程式庫提供 C 和 C++ 函式,用於註冊處理程序的追蹤記錄 使用 Fuchsia 追蹤系統執行引擎。如要追蹤在程序中運作的追蹤記錄, 您需在執行期間的某個時間點初始化追蹤記錄提供者。 或者,您也可以實作自己的追蹤處理常式來註冊 追蹤引擎
追蹤提供者需要非同步調度器才能運作。
C++
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <trace-provider/provider.h>
int main(int argc, char** argv) {
// Create a message loop.
async::Loop loop(&kAsyncLoopConfigNoAttachToCurrentThread);
// Start a thread for the loop to run on.
// Alternatively, you could use async_loop_run() to run on the current thread.
zx_status_t status = loop.StartThread();
if (status != ZX_OK) exit(1);
// Create the trace provider.
trace::TraceProviderWithFdio trace_provider(loop.dispatcher());
// Do something...
// The loop and trace provider will shut down once the scope exits.
return 0;
}
C 罩杯
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <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;
}
libtrace:C 和 C++ 追蹤事件程式庫
這個程式庫提供用於檢測 C 和 C++ 的巨集和內嵌函式 含有追蹤點的程式,用於在追蹤記錄執行期間擷取追蹤記錄資料。
請參閱「//zircon/system/ulib/trace/include/lib/trace/event.h
」。
C++
這個範例會記錄
一起執行 DoSomething
函式及其參數。
#include <trace/event.h>
void DoSomething(int a, std::string b) {
TRACE_DURATION("example", "DoSomething", "a", a, "b", b);
// Do something
}
C 罩杯
這個範例會記錄
一起執行 DoSomething
函式及其參數。
與 C++ 不同,您必須指定每個追蹤記錄引數的類型。 C++ 支援這類註解,但由於編譯器支援,因此選用註解 就能推論類型本身
#include <trace/event.h>
void DoSomething(int a, const char* b) {
TRACE_DURATION("example", "DoSomething", "a", TA_INT32(a), "b", TA_STRING(b));
// Do something
}
fuchsia_trace:Rust Crate
這個程式庫提供使用追蹤點檢測 Rust 程式的巨集 以在追蹤記錄執行期間擷取追蹤記錄資料。
在編譯單位內抑制追蹤記錄
如要在編譯單位內完全隱藏追蹤記錄,請定義 NTRACE
巨集,則在加入追蹤記錄標頭之前。這會導致巨集
就像追蹤一律停用一樣,因此不會產生追蹤記錄
也不會產生執行階段負擔
#define NTRACE
#include <trace/event.h>
void DoSomething(void) {
// This will never produce trace records because the NTRACE macro was
// defined above.
TRACE_DURATION("example", "DoSomething");
}
libtrace-Reader:Trace 讀取器程式庫
這個程式庫提供用於讀取追蹤記錄封存的 C++ 類型和函式。
請參閱「//zircon/system/ulib/trace-reader/include/trace-reader/reader.h
」。