Continuous profiling is now GA

Last updated:

Symbolize Profiles

Make profiles of C, C++, Rust, and Go code show function names, files, and lines by providing debuginfo to Dash0.

eBPF profilers record memory addresses for frames in compiled code. Symbolization translates these addresses into function names, source files, and line numbers. Dash0 symbolizes compiled code with debuginfo, the sections of a binary that map address ranges to this metadata.

Which code needs debuginfo

CodeWhat Dash0 needs
C, C++, and RustDebuginfo for each binary and shared library you want to read.
GoDebuginfo, or the binary's gopclntab. Go binaries always contain gopclntab because the Go runtime needs it, and it carries the same function and line information.
Interpreted and JIT-compiled runtimes, such as Python, Java, and Node.jsNo debuginfo. The profiler reads their frames from the runtime.

For Node.js applications written in TypeScript, Dash0 resolves frames to the original source with source maps through the same mechanism.

Recognize missing debuginfo

When symbolization fails, frames show a memory address, or only a binary name, instead of a function name. Inspect the frame's Binary / executable name and Build ID to identify the binary without debuginfo. In the flame graph, Color by Binary groups frames of the same binary by color. See Adjust display settings.

Keep debuginfo in production binaries

The simplest setup is to deploy binaries that include their debuginfo. Dash0 runs its own services this way.

The operator-managed Parca Agent finds debuginfo in the binaries it profiles. It uploads the information needed for symbolization to every Dash0 export in the operator configuration. You do not need to change your build pipeline. See Debuginfo uploads for the upload settings.

Debuginfo increases the size of the binary on disk. It is not loaded into memory during normal execution.

Upload debuginfo from CI

If you strip debuginfo before deploying, upload it from your CI pipeline with the parca-debuginfo tool. Run the upload on the unstripped binary, before the strip step:

sh
parca-debuginfo upload \
  --store-address=ingress.YOUR_REGION.dash0.com:4317 \
  --bearer-token="$DASH0_AUTH_TOKEN" \
  --grpc-headers=dash0-dataset=YOUR_DATASET \
  ./path/to/binary
  • Replace the address with your organization's OTLP gRPC endpoint.
  • Use an auth token that can ingest into the dataset, and keep it in your CI secrets.
  • Set dash0-dataset to the dataset that receives the profiles.

Dash0 matches uploaded debuginfo to profiles by build ID. Stripping a binary keeps its build ID, but a separate build usually gets a different one. Upload the debuginfo from the same build that you deploy.

Further Reading