跟踪库

如需进行跟踪,您可以使用以下库:

libtrace-provider:跟踪提供程序库

此库提供 C 和 C++ 函数来注册进程的跟踪记录 引擎以及 Fuchsia 跟踪系统。为了让跟踪记录在你的进程中起作用 您必须在跟踪提供程序执行过程中的某个时间点初始化跟踪提供程序。 或者,您可以实现自己的跟踪处理程序以注册 Trace Engine

轨迹提供程序需要异步调度程序才能运行。

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;
}

#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
}

本示例记录了标记了 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 程序进行插桩的宏 用于在轨迹执行期间捕获轨迹数据。

请参阅 fuchsia_trace 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