{"record":{"id":"25eb40e9ea5a5a07","repo":"go-delve/delve","slug":"too-many-bytes-when-setting-register-s","errorCode":null,"errorMessage":"too many bytes when setting register %s","messagePattern":"too many bytes when setting register (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/winutil/regs_amd64_arch.go","lineNumber":343,"sourceCode":"\t\tp = &ctx.R15\n\tcase regnum.AMD64_Rip:\n\t\tp = &ctx.Rip\n\t}\n\n\tif p != nil {\n\t\tif reg.Bytes != nil && len(reg.Bytes) != 8 {\n\t\t\treturn fmt.Errorf(\"wrong number of bytes for register %s (%d)\", regnum.AMD64ToName(regNum), len(reg.Bytes))\n\t\t}\n\t\t*p = reg.Uint64Val\n\t} else if regNum == regnum.AMD64_Rflags {\n\t\tctx.EFlags = uint32(reg.Uint64Val)\n\t} else {\n\t\tif regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {\n\t\t\treturn fmt.Errorf(\"can not set register %s\", regnum.AMD64ToName(regNum))\n\t\t}\n\t\treg.FillBytes()\n\t\tif len(reg.Bytes) > 16 {\n\t\t\treturn fmt.Errorf(\"too many bytes when setting register %s\", regnum.AMD64ToName(regNum))\n\t\t}\n\t\tcopy(ctx.FltSave.XmmRegisters[(regNum-regnum.AMD64_XMM0)*16:], reg.Bytes)\n\t}\n\treturn nil\n}\n","sourceCodeStart":325,"sourceCodeEnd":349,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/winutil/regs_amd64_arch.go#L325-L349","documentation":"In Delve's Windows AMD64 backend, setting a register via SetReg validates the value being written. For XMM registers (regnum.AMD64_XMM0..+15), after calling reg.FillBytes() the byte slice must be at most 16 bytes (128-bit XMM width); a longer value cannot fit in the XMM register slot in CONTEXT.FltSave, so this error is thrown instead of truncating or corrupting memory.","triggerScenarios":"Calling the debugger's SetReg API on a Windows amd64 target with a register value whose serialized byte representation exceeds 16 bytes, targeting an XMM register (XMM0-XMM15). This happens if the caller supplies a value typed as a larger vector/register (e.g. 256-bit AVX or 512-bit ZMM data) or a wrongly-filled register value struct.","commonSituations":"Users or tools attempting to modify vector registers from scripts/RPC with oversized values; automation that fills reg.Bytes from a wider register dump; copy-pasted code assuming YMM/ZMM support which Delve's Windows backend does not implement.","solutions":["Ensure the register value is at most 16 bytes before calling SetReg (truncate/mask the value to 128 bits).","Verify you are targeting an XMM register and not expecting YMM/ZMM writes, which this backend does not support.","If writing a general-purpose register instead, use the non-XMM code path (regNum outside AMD64_XMM0..+15) where different sizing applies.","Check the byte encoding used to build reg (FillBytes output) — a wrong size value in the register value struct inflates Bytes length."],"exampleFix":"// before\nreg.FillBytes() // reg.Bytes is 32 bytes (YMM-sized value)\ncopy(ctx.FltSave.XmmRegisters[(regNum-regnum.AMD64_XMM0)*16:], reg.Bytes)\n// after\nreg.FillBytes()\nif len(reg.Bytes) > 16 {\n    reg.Bytes = reg.Bytes[:16] // fit XMM 128-bit width\n}\ncopy(ctx.FltSave.XmmRegisters[(regNum-regnum.AMD64_XMM0)*16:], reg.Bytes)","handlingStrategy":"validation","validationCode":"reg.FillBytes()\nif len(reg.Bytes) > 16 {\n    return fmt.Errorf(\"value too large for XMM register: %d bytes (max 16)\", len(reg.Bytes))\n}","typeGuard":"func isSettableXMMValue(reg proc.RegisterValue) bool {\n    b := reg.Bytes\n    return b == nil || len(b) <= 16\n}","tryCatchPattern":"if err := thread.SetReg(regNum, reg); err != nil {\n    if strings.Contains(err.Error(), \"too many bytes when setting register\") {\n        // fallback: mask value to 128 bits and retry\n    }\n    return err\n}","preventionTips":["Cap vector register values at 16 bytes (128 bits) before calling SetReg.","Remember Windows amd64 backend supports XMM only — no YMM/ZMM writes.","Validate register width against the target register's DWARF/known size before writing.","Check regNum is in the intended range so the correct code path validates sizes."],"tags":["windows","amd64","registers","debugger"],"backgroundTag":"register-size-mismatch","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}