Trace providers must register with the trace manager in order to participate in tracing. Drivers don't have to register as a trace provider since the devhost process does it through libdriver.so
.
To register a trace provider, you must do the following:
Note: For more information on the Fuchsia tracing system, see Fuchsia tracing system.
To register as a trace provider, you can use the libtrace-provider
library to provide an asynchronous loop in your component's code.
Note: For more information on tracing libraries, see Tracing libraries.
For example:
{C++}
Note: This example uses fdio
to set up the FIDL channel with Trace Manager. For more information, see fdio
.
#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; }
In the component manifest file (a .cmx
file) of your component, you must specify that it needs to communicate with the Fuchsia trace manager.
Note: For information on component manifests, see Component Manifests.
To give the trace manager component access, specify fuchsia.tracing.provider.Registry
as a “services”. For example:
{.cmx file}
{ "program": { "binary": "bin/app" }, "sandbox": { "services": [ "fuchsia.tracing.provider.Registry" ] } }
Once you have registered your component as a trace provider, you can enable tracing in your code. For more information, see Adding tracing in your code.