Last updated:
Symbolize Profiles
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
| Code | What Dash0 needs |
|---|---|
| C, C++, and Rust | Debuginfo for each binary and shared library you want to read. |
| Go | Debuginfo, 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.js | No 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:
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-datasetto 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
- Collect and Send Profiles — Choose a profiler.
- Profiling Security — What debuginfo uploads contain.
- Key Concepts — Frames and the metadata a profiler supplies.
- Parca debuginfo CLI — Extract and upload debuginfo.