go-delve/delve · error

can not set %s

Error message

can not set %s

What it means

fbsdutil.SetReg only supports writing XMM0–XMM15 floating-point registers (after handling named GP registers); any other register number yields 'can not set <name>'. Segment registers, debug registers, and other non-XMM registers are deliberately read-only through this path on FreeBSD. The message names the register so you know which write was refused.

Source

Thrown at pkg/proc/fbsdutil/regs.go:243

	}

	if p != nil {
		if reg.Bytes != nil && len(reg.Bytes) != 8 {
			return false, fmt.Errorf("wrong number of bytes for register %s (%d)", regnum.AMD64ToName(regNum), len(reg.Bytes))
		}
		*p = int64(reg.Uint64Val)
		return false, nil
	}

	if r.loadFpRegs != nil {
		if err := r.loadFpRegs(r); err != nil {
			return false, err
		}
		r.loadFpRegs = nil
	}

	if regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {
		return false, fmt.Errorf("can not set %s", regnum.AMD64ToName(regNum))
	}

	reg.FillBytes()

	if err := r.Fpregset.SetXmmRegister(int(regNum-regnum.AMD64_XMM0), reg.Bytes); err != nil {
		return false, err
	}
	return true, nil
}

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Set the PC via the supported API (e.g. DirChange/SetPC through proc thread methods) instead of raw SetReg
  2. Restrict writes to XMM0–XMM15 if you need FP register modification
  3. If you need another register set, extend the FreeBSD backend's SetReg/Fpregset support upstream

Example fix

// before
thread.SetReg(regnum.AMD64_RIP, reg) // not supported here
// after
thread.SetPC(addr) // use the dedicated PC-setting API
Defensive patterns

Strategy: validation

Validate before calling

if regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {
	// route to SetPC or another supported API instead of SetReg
}

Type guard

func isSettableXMM(r int) bool { return r >= regnum.AMD64_XMM0 && r <= regnum.AMD64_XMM0+15 }

Try / catch

null

Prevention

When it happens

Trigger: Attempting to set any register outside XMM0–XMM15 via SetReg — e.g. segment registers (FS/GS), control/debug registers, or an out-of-range regnum — through WriteRegister or the RPC SetRegister API on FreeBSD.

Common situations: Automation trying to tweak PC/RIP through the wrong register API; porting amd64 Linux tooling that sets registers FreeBSD's fbsdutil layer doesn't allow; misnumbered register constants.

Related errors


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