Skip to content

proc/internal/ebpf: switch to header+param event ring buffer protocol#4352

Merged
aarzilli merged 2 commits into
go-delve:masterfrom
derekparker:feature/ebpf-event-protocol
May 25, 2026
Merged

proc/internal/ebpf: switch to header+param event ring buffer protocol#4352
aarzilli merged 2 commits into
go-delve:masterfrom
derekparker:feature/ebpf-event-protocol

Conversation

@derekparker

Copy link
Copy Markdown
Member

Replace the single bpf_ringbuf_reserve/submit of the entire function_parameter_list_t struct with a multi-event protocol: one HEADER event per uprobe hit followed by one PARAM event per parameter. Each PARAM event carries the parameter's kind, val (0x30 bytes), and deref_val (0x30 bytes) inline via bpf_ringbuf_reserve/submit.

BPF changes:

  • Define packed event_header_t and param_event_t wire structs
  • Snapshot registers into a stack-local u64[16] array so helpers receive PTR_TO_STACK instead of PTR_TO_CTX, which the verifier accepts for indexed access
  • Remove goroutine_id from function_parameter_list_t; compute it at runtime and embed it in the HEADER event
  • Keep the existing val[0x30]/deref_val[0x30] data layout and the string/pointer/slice deref helpers unchanged

Go-side changes:

  • Deadline-based ring buffer polling: set a 10 ms deadline before each Read() call so the goroutine unblocks to check for context cancellation without a concurrent SetDeadline call
  • Pending-event reassembly: buffer HEADER events in a map keyed by (goroutine_id, fn_addr, is_ret) and attach incoming PARAM events; emit the completed RawUProbeParams once all params arrive
  • Store DWARF types and parameter names during UpdateArgMap and look them up by global index when parsing PARAM events, replacing the old argTypeInfo map
  • synthesizeTypeFromKind: create a godwarf.Type from reflect.Kind for parameters that lack a full DWARF type

Other changes:

  • CFA offset fix: use FirstPCAfterPrologue and the frame table to compute the CFA-from-RSP offset at the uprobe PC so DW_OP_fbreg expressions evaluate to correct RSP-relative offsets; input and return parameters are now evaluated at different PCs
  • Thread a LoadConfig through the RPC, debugger, and target layers so trace output verbosity is configurable
  • Upgrade the eBPF Docker build image to Ubuntu 26.04 / clang-22

This sets the stage for additional changes to be submitted later to allow for larger structs / arrays and dereferencing pointers.

Replace the monolithic function_parameter_list_t ring buffer write with a
structured two-event protocol: a HEADER event followed by per-parameter
PARAM events. Each param event carries the parameter's val and deref_val
data inline (0x30 bytes each), matching the original data model.

Key changes:
- BPF C: new event_header_t/param_event_t wire protocol with per-param
  bpf_ringbuf_reserve/submit, register snapshot via stack array
- Go helpers: deadline-based ring buffer polling (no more blocking
  Read()), pending event reassembly with goroutine+fn+is_ret keying,
  DWARF type and parameter name lookup by global index, type synthesis
  from reflect.Kind for backward compatibility
- LoadConfig plumbing: thread LoadConfig through RPC → debugger → target
  so trace output verbosity is configurable
- CFA offset fix: compute uprobe PC via FirstPCAfterPrologue and use
  frame table CFA offset for correct RSP-relative stack parameter
  locations (input vs return params now evaluated differently)
- Build: upgrade Docker image to Ubuntu 26.04 / clang-22
@derekparker derekparker marked this pull request as ready for review May 20, 2026 21:17

@aarzilli aarzilli left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TestGeneratedDoc fails.

@derekparker derekparker force-pushed the feature/ebpf-event-protocol branch from 545e403 to 59abd8e Compare May 22, 2026 16:28

@aarzilli aarzilli left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@aarzilli aarzilli merged commit 8fc4acb into go-delve:master May 25, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants