{"record":{"id":"7c0252a02ef42b55","repo":"go-delve/delve","slug":"error-reading-thread-note-registers-for-thread-d","errorCode":null,"errorMessage":"error reading thread note registers for thread %d: %v","messagePattern":"error reading thread note registers for thread (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/core/delve_core.go","lineNumber":116,"sourceCode":"\t\t\tread(&len)\n\t\t\tif maxlen > 0 && len > maxlen {\n\t\t\t\treaderr = fmt.Errorf(\"maximum len exceeded (%d) reading %s\", len, kind)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif readerr != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tbuf := make([]byte, len)\n\t\t\t_, readerr = body.Read(buf)\n\t\t\treturn buf\n\t\t}\n\n\t\tfor i := 0; i < int(n); i++ {\n\t\t\tname := string(readBytes(20, \"register name\"))\n\t\t\tvalue := readBytes(2048, \"register value\")\n\t\t\tth.regs.slice[i] = proc.Register{Name: name, Reg: op.DwarfRegisterFromBytes(value)}\n\t\t\tif readerr != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"error reading thread note registers for thread %d: %v\", th.id, readerr)\n\t\t\t}\n\t\t}\n\n\t\tp.Threads[int(th.id)] = &thread{th, p, proc.CommonThread{}}\n\t\tif currentThread == nil {\n\t\t\tcurrentThread = p.Threads[int(th.id)]\n\t\t}\n\t}\n\treturn currentThread, nil\n}\n\ntype delveThread struct {\n\tid   uint64\n\tregs *delveRegisters\n}\n\nfunc (th *delveThread) ThreadID() int {\n\treturn int(th.id)","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/core/delve_core.go#L98-L134","documentation":"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.","triggerScenarios":"readLinuxOrPlatformIndependentCore -> threadsFromDelveNotes: while iterating n registers, a readBytes call fails (EOF or 'maximum len exceeded') for one of the thread's registers.","commonSituations":"Truncated core file cutting off register data mid-note; corrupted register-count or lengths causing misalignment; partial download of the core.","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."],"exampleFix":"// before (incomplete core)\n$ ls -l core  # smaller than the dump reported\n// after\n$ dlv core <exe> core  # with freshly regenerated, verified core","handlingStrategy":"retry","validationCode":"// Sanity-check register count against a plausible maximum before iterating\nconst maxRegisters = 512\nif n > maxRegisters {\n\treturn fmt.Errorf(\"thread claims %d registers; core is likely corrupt\", n)\n}","typeGuard":null,"tryCatchPattern":"p, err := core.ReadFile(exePath, corePath)\nif err != nil && strings.Contains(err.Error(), \"error reading thread note registers\") {\n\t// retry once with a freshly regenerated core if available\n\treturn retryWithFreshCore(exePath)\n}","preventionTips":["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."],"tags":["core-dump","registers","truncated-file"],"backgroundTag":"truncated-core-file","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}