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

  1. Re-obtain a complete core file (verify checksum/size against the original).
  2. Regenerate the core dump with delve.
  3. Inspect the note bytes around the failing register to confirm corruption vs version mismatch.
  4. 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

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


AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31). Data as JSON: /api/errors/7c0252a02ef42b55. Report an issue: GitHub.