| # Tracing across reboot |
| |
| _This data source is supported only on the linux-based systems._ |
| |
| The "linux.frozen_ftrace" data source is used for reading the ftrace |
| trace data recorded in the previous boot on the persistent ring buffer. |
| |
| This data source allows you to dump the last seconds of the ftrace |
| trace data in the previous boot time, for analyzing the system crash |
| reason from the ftrace trace log. |
| |
| Therefore, this is expected that the user ran the another perfetto |
| trace session in background on the special persistent ring buffer. |
| |
| ### Creating a persistent ring buffer |
| |
| You have to set up a ftrace persistent ring buffer via the kernel |
| cmdline. If you need a 20MiB persistent ring buffer, you need to |
| add following kernel options to the kernel cmdline when boot. |
| |
| ``` |
| reserve_mem=20M:2M:trace trace_instance=boot_mapped^traceoff@trace |
| ``` |
| |
| This creates a `boot_mapped` ftrace instance on a reserved memory area, |
| which will preseve the data and be attatched again in the next boot. |
| (Note: this is not 100% sure if the kernel configuration has been |
| changed or kernel address mapping is changed by KASLR.) |
| |
| ### Use the persistent ring buffer |
| |
| Normally, perfetto will record the ftrace data in the top level instance |
| instead of the sub-instances. Thus you need to specify `instance_name:` |
| option to your trace config. Also, you need to run the trace session as |
| long-time backend session. What you need are; |
| |
| - Specify `RING_BUFFER` fill_policy to all buffers which receives ftrace |
| data source. |
| - Specify `instance_name: "boot_mapped"` to the ftrace data source. |
| (NOTE: Split the `atrace` data source from this data source, since |
| atrace related events can not be used for this instance.) |
| - Do not specify `duration_ms:`. |
| |
| And run the perfetto command with `--background` option. |
| |
| Once you have done it, prepare for a crash. |
| |
| ### Read out the data after crash |
| |
| After the system crash, you will see the `boot_mapped` instance, which |
| should keep the trace data recorded in the last seconds. |
| |
| Run the perfetto with `"linux.frozen_ftrace"` data source like; |
| |
| ``` |
| buffers { |
| size_kb: 65536 |
| fill_policy: DISCARD |
| } |
| |
| data_sources { |
| config { |
| name: "linux.frozen_ftrace" |
| frozen_ftrace_config { |
| instance_name: "boot_mapped" |
| } |
| } |
| } |
| |
| duration_ms: 5000 |
| ``` |