go-delve/delve · critical
Could not read byte
Error message
Could not read byte
What it means
advanceloc panics when it cannot read the delta byte for a DW_CFA_advance_loc1-style one-byte location advance. The frame instruction stream ended exactly where an operand byte was expected, meaning the CFI program is truncated relative to its declared length.
Source
Thrown at pkg/dwarf/frame/table.go:255
instruction = DW_CFA_restore
restore = true
}
if restore {
// Restore the last byte as it actually contains the argument for the opcode.
err := buf.UnreadByte()
if err != nil {
panic("Could not unread byte")
}
}
return fnlookup[instruction]
}
func advanceloc(frame *FrameContext) {
b, err := frame.buf.ReadByte()
if err != nil {
panic("Could not read byte")
}
delta := b & low_6_offset
frame.loc += uint64(delta) * frame.codeAlignment
}
func advanceloc1(frame *FrameContext) {
delta, err := frame.buf.ReadByte()
if err != nil {
panic("Could not read byte")
}
frame.loc += uint64(delta) * frame.codeAlignment
}
func advanceloc2(frame *FrameContext) {
var delta uint16
binary.Read(frame.buf, frame.order, &delta)View on GitHub (pinned to a23773e6c3)
Solutions
- Verify the binary/core integrity and re-acquire it from a trusted source
- Check that the binary and core dump match (same build ID)
- Report to delve maintainers — this should be an error return, not a panic
- Recover from the panic at the call site and skip frame unwinding for that frame
Example fix
// before
frames, err := t.ExecuteUntilPC(pc) // panic on malformed stream
// after
func safeFrames(t *frame.Table, pc uint64) (frames []frame.Frame, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("invalid CFI stream: %v", r)
}
}()
fde, e := t.ExecuteUntilPC(pc)
if e != nil {
return nil, e
}
frames, err = fde.EstablishFrame(t.CIE) // illustrative decode
return
} Defensive patterns
Strategy: try-catch
Try / catch
func safeAdvance(t *frame.FrameDescriptionEntry) (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("truncated CFI stream: %v", r)
}
}()
// trigger the decode path
return nil
} Prevention
- Verify section integrity (SHT sizes vs declared FDE lengths) when pre-processing binaries
- Ensure core files are fully flushed/complete before analysis
- Recover around frame decoding and degrade gracefully (partial stack)
- Keep delve updated; parser hardening fixes land over time
When it happens
Trigger: Parsing a frame description entry whose declared length extends past the end of the section data; corrupted .debug_frame/.eh_frame sections; decode bugs where buf was not rewound between CFI programs.
Common situations: Analyzing a truncated or partially downloaded binary; core dump files whose mapped frame sections are incomplete; third-party binaries with hand-written assembler frames.
Related errors
- Could not read from instruction buffer
- Could not unread byte
- panic(err)
- Could not parse ULEB128 value
- Could not parse SLEB128 value
AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31).
Data as JSON: /api/errors/486ded9fbcafeef8.
Report an issue: GitHub.