go-delve/delve · error

failed to get xstate info: %v

Error message

failed to get xstate info: %v

What it means

On FreeBSD/amd64 the native backend reads the XSAVE area size via PT_GETXSTATE_INFO to read extended CPU register state (XMM, AVX). ptraceGetXsaveLen caches this length; if the ptrace call fails it stores a negative length plus this wrapped error. Failure means the kernel does not support the xstate ptrace interface or the tid is invalid.

Source

Thrown at pkg/proc/native/ptrace_freebsd_amd64.go:29

	"unsafe"

	"github.com/go-delve/delve/pkg/proc/amd64util"
	"github.com/go-delve/delve/pkg/proc/native/cpuid"
)

var (
	xsaveLen int
	xsaveErr error
)

func ptraceGetXsaveLen(tid int) (int, error) {
	var info C.struct_ptrace_xstate_info
	ret, err := C.ptrace(C.PT_GETXSTATE_INFO, C.pid_t(tid), C.caddr_t(unsafe.Pointer(&info)), C.int(unsafe.Sizeof(info)))
	if ret == 0 {
		xsaveLen = int(info.xsave_len)
	} else {
		xsaveLen, xsaveErr = -1, err
		return xsaveLen, fmt.Errorf("failed to get xstate info: %v", err)
	}
	return xsaveLen, nil
}

func ptraceXsaveLen(tid int) (int, error) {
	if xsaveLen > 0 {
		return xsaveLen, nil
	}
	if xsaveLen < 0 {
		return xsaveLen, fmt.Errorf("failed to get xstate info: %v", xsaveErr)
	}
	return ptraceGetXsaveLen(tid)
}

// ptraceGetXsave gets the X86 XSAVE data for the given tid.
func ptraceGetXsave(tid int) ([]byte, error) {
	len, err := ptraceXsaveLen(tid)
	if err != nil {

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Check the wrapped ptrace error in %v (errno) — ESRCH usually means the thread exited; retry with a live thread.
  2. Verify kernel support: sysctl hw.instruction and FreeBSD version >= 9 with XSAVE enabled.
  3. Ensure XSAVE is enabled in BIOS/hypervisor (it can be disabled in some VM configurations).
  4. Update Delve — FreeBSD register support continues to evolve.

Example fix

// before
pw.error: failed to get xstate info: no such process
// (thread exited before register read)
// after
# ensure the process is still stopped/alive before reading registers
proc status <pid>  # or re-select a live goroutine in delve
dlv attach <pid>
Defensive patterns

Strategy: retry

Try / catch

v, err := eval.Variable("someVar")
if err != nil && strings.Contains(err.Error(), "failed to get xstate info") {
    // check errno in message: ESRCH -> thread exited, re-select live goroutine and retry
}

Prevention

When it happens

Trigger: Register/register-info evaluation on FreeBSD when PT_GETXSTATE_INFO fails — unsupported kernel (pre-xsave ptrace interface), non-amd64 mismatch, or dead/invalid thread id.

Common situations: Running an older FreeBSD kernel without XSAVE ptrace support; debugging a thread that just exited (stale tid); virtualized environments restricting ptrace xstate operations.

Related errors


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