go-delve/delve · error
error reading thread note registers for thread %d: %v
Error message
error reading thread note registers for thread %d: %v
What it means
For each register entry in a thread note, threadsFromDelveNotes reads a name (<=20 bytes) and a value (<=2048 bytes). If readerr was set while reading any register of a thread (EOF, exceeded max length, or I/O error), parsing aborts with this error naming the thread id.
Source
Thrown at pkg/proc/core/delve_core.go:116
read(&len)
if maxlen > 0 && len > maxlen {
readerr = fmt.Errorf("maximum len exceeded (%d) reading %s", len, kind)
return nil
}
if readerr != nil {
return nil
}
buf := make([]byte, len)
_, readerr = body.Read(buf)
return buf
}
for i := 0; i < int(n); i++ {
name := string(readBytes(20, "register name"))
value := readBytes(2048, "register value")
th.regs.slice[i] = proc.Register{Name: name, Reg: op.DwarfRegisterFromBytes(value)}
if readerr != nil {
return nil, fmt.Errorf("error reading thread note registers for thread %d: %v", th.id, readerr)
}
}
p.Threads[int(th.id)] = &thread{th, p, proc.CommonThread{}}
if currentThread == nil {
currentThread = p.Threads[int(th.id)]
}
}
return currentThread, nil
}
type delveThread struct {
id uint64
regs *delveRegisters
}
func (th *delveThread) ThreadID() int {
return int(th.id)View on GitHub (pinned to a23773e6c3)
Solutions
- Re-obtain a complete core file (verify checksum/size against the original).
- Regenerate the core dump with delve.
- Inspect the note bytes around the failing register to confirm corruption vs version mismatch.
- Use a matching writer/reader delve version.
Example fix
// before (incomplete core) $ ls -l core # smaller than the dump reported // after $ dlv core <exe> core # with freshly regenerated, verified core
Defensive patterns
Strategy: retry
Validate before calling
// Sanity-check register count against a plausible maximum before iterating
const maxRegisters = 512
if n > maxRegisters {
return fmt.Errorf("thread claims %d registers; core is likely corrupt", n)
} Try / catch
p, err := core.ReadFile(exePath, corePath)
if err != nil && strings.Contains(err.Error(), "error reading thread note registers") {
// retry once with a freshly regenerated core if available
return retryWithFreshCore(exePath)
} Prevention
- Verify core completeness (size + checksum) before loading.
- Regenerate the dump on repeated register-read failures.
- Use the same delve version to write and read cores.
- Store cores on reliable storage to avoid silent truncation.
When it happens
Trigger: readLinuxOrPlatformIndependentCore -> threadsFromDelveNotes: while iterating n registers, a readBytes call fails (EOF or 'maximum len exceeded') for one of the thread's registers.
Common situations: Truncated core file cutting off register data mid-note; corrupted register-count or lengths causing misalignment; partial download of the core.
Related errors
- can not change register values of core process
- error reading thread note header for thread %d: %v
- aligning after name: %v
- reading desc: %v
- minidump %s truncated at offset %#x while %s
AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31).
Data as JSON: /api/errors/7c0252a02ef42b55.
Report an issue: GitHub.