Today we are excited to announce support for applications without frame pointers! This has been a longstanding issue for native applications such as C, C++, or Rust.
We have been working on this feature for a little while. Implementing this new stack walker in eBPF has been an interesting technical challenge, so stay tuned for an in-depth write-up we are going to publish next week!
Why is this needed?
Frame pointers can be thought of breadcrumbs that compilers insert in every function to allow different tools, such as profilers, to reliably and cheaply capture stacktraces. Unfortunately even if you compile your application with frame pointers, it's highly likely that some library you use doesn't have them, as many Linux distributions disable them by default for a variety of reasons.
This causes incorrect profiles, greatly affecting our ability to understand the performance characteristics of our software.
Our implementation uses DWARF unwind information that compilers emit and write in the
.eh_frame section. This is similar to the DWARF mode (
perf uses. Our approach, however, increases both security and performance. More details to come in next week's post.
Trying it out
You can try this feature on the latest Parca Agent release. Right now it's under a feature flag. It can be enabled with:
$ ./parca-agent [...] --experimental-enable-dwarf-unwinding \--debug-process-names="(postgres|mysql|redpanda)"
While we can now successfully profile some large native applications such as Firefox, Postgres, Redpanda, Nginx, and many others, we are not done yet! We are actively working on enabling it by default.
We are looking forward to your feedback! We've created a GitHub discussion, and are always happy to answer questions either on GitHub or in our Discord.