| # Tracing Booting Fuchsia |
| |
| The Zircon kernel's internal tracing system can be active on boot |
| (and in fact is currently the default). This means that one can trace |
| at least the kernel side of booting without extra effort. The data |
| is already there, one just needs to collect it. |
| |
| ## Including kernel boot trace data in trace results |
| |
| As long as the kernel's internal trace buffer is not rewound the data |
| is available to be included in the trace. This is achieved by passing |
| category "kernel:retain" to the `trace` or `traceutil` program. |
| Note that the moment a trace is made without passing `kernel:retain` |
| then the ktrace buffer is rewound and the data is lost. |
| |
| Example: |
| |
| ```shell |
| # ... Fuchsia boots ... |
| host$ fx traceutil record --categories=kernel,kernel:retain \ |
| --buffer-size=64 --duration=1s --stream |
| ``` |
| |
| There are a few important things to note here. |
| |
| The first thing to note is the categories passed: `kernel` and `kernel:retain`. |
| The `kernel` category tells the kernel to trace everything. |
| In this example the kernel has already been tracing everything: that is |
| the default on boot. It is specified here as a simple way to |
| tell `ktrace_provider`, which is the interface between the Fuchsia tracing |
| system and the kernel, that kernel data is being collected. |
| The `kernel:retain` category tells `ktrace_provider` not to rewind the |
| kernel trace buffer at the start of tracing. |
| |
| The second is the buffer size. The kernel's default trace buffer size |
| is 32MB whereas the Fuchsia trace default buffer size is 4MB. |
| Using a larger Fuchsia trace buffer size means there is enough space |
| to hold the contents of the kernel's trace buffer. |
| There are some implementation quirks at play here. |
| The kernel currently has its own trace format called "ktrace". When |
| tracing stops the `ktrace_provider` program reads the kernel trace buffer |
| and converts it to Fuchsia's trace format. Depending on circumstances |
| the ktrace buffer format is a little more compact. That is why the |
| above example provides a 64MB buffer even though the kernel's buffer |
| size was 32MB. |
| |
| The third important thing to note is that in this example we just want |
| to grab the current contents of the trace buffer, and aren't interested |
| in tracing anything more. That is why a duration of one second is used. |
| Ideally we would pass `--duration=0s` but `traceutil` currently interprets |
| that as requesting the default which is ten seconds. |
| |
| The `--stream` arg just says to send the results directly to the development |
| host instead of first writing them to disk on the target. |
| |
| # Changing kernel trace parameters at boot |
| |
| The size of the kernel's trace buffer can be changed at boot time |
| with the `ktrace.bufsize=N` command line option, where `N` is the size |
| of the buffer in megabytes. |
| |
| The choice of data to collect is controlled with the `ktrace.grpmask=0xNNN' |
| command line option. The 0xNNN value is a bit mask of *KTRACE\_GRP\_\** |
| values from |
| //zircon/system/ulib/zircon-internal/include/lib/zircon-internal/ktrace.h. |
| The default is 0xfff which enables all trace categories (or groups in |
| ktrace parlance). |
| |
| For more information on Zircon command line options see |
| [kernel\_cmdline][kernel_cmdline]. |
| |
| |
| [kernel_cmdline]: /docs/reference/kernel/kernel_cmdline.md |