对于跟踪,您可以使用以下库:
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
}
禁止编译单元内的跟踪
若要完全禁止编译单元内的跟踪,请在添加轨迹头文件之前定义 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:跟踪读取器库
此库提供用于读取轨迹归档的 C++ 类型和函数。
请参见//zircon/system/ulib/trace-reader/include/trace-reader/reader.h
。