blob: c20afd0c46290d0cabef337d907dfef305c1bc8e [file] [log] [blame] [view]
# Tracing libraries
For tracing, you can use the following libraries:
* [libtrace-provider: Trace provider library](#libtrace-provider)
* [libtrace: The C and C++ trace event library](#libtrace-trace-event)
* [libtrace-reader: Trace reader library](#libtrace-reader)
## libtrace-provider: Trace provider library {#libtrace-provider}
This library provides C and C++ functions to register a process's trace
engine with the Fuchsia tracing system. For tracing to work in your process,
you must initialize the trace provider at some point during its execution.
Alternatively, you can implement your own trace handler to register the
trace engine in some other way.
The trace provider requires an asynchronous dispatcher to operate.
* {C++}
Note: This example uses `fdio` to set up the FIDL channel with the trace
manager. For more information, see
[`fdio`](/docs/concepts/system/life_of_an_open.md#fdio).
```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 }
```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: The C and C++ trace event library {#libtrace-trace-event}
This library provides macros and inline functions for instrumenting C and C++
programs with trace points for capturing trace data during trace execution.
See [`//zircon/system/ulib/trace/include/lib/trace/event.h`](/zircon/system/ulib/trace/include/lib/trace/event.h).
* {C++}
This example records trace events marking the beginning and end of the
execution of the `DoSomething` function together with its parameters.
```c++
#include <trace/event.h>
void DoSomething(int a, std::string b) {
TRACE_DURATION("example", "DoSomething", "a", a, "b", b);
// Do something
}
```
* {C }
This example records trace events marking the beginning and end of the
execution of the `DoSomething` function together with its parameters.
Unlike in C++, it is necessary to specify the type of each trace argument.
In C++ such annotations are supported but are optional since the compiler
can infer the type itself.
```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
}
```
### Suppress tracing within a compilation unit {#suppress-tracing-within-a-compilation-unit}
To completely suppress tracing within a compilation unit, define the `NTRACE`
macro prior to including the trace headers. This causes the macros to
behave as if tracing is always disabled so they will not produce trace
records and they will have zero runtime overhead.
```c
#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 reader library {#libtrace-reader}
This library provides C++ types and functions for reading trace archives.
See [`//zircon/system/ulib/trace-reader/include/trace-reader/reader.h`](/zircon/system/ulib/trace-reader/include/trace-reader/reader.h).