go-delve/delve · error

procstat_getauxv failed: %v

Error message

procstat_getauxv failed: %v

What it means

EntryPoint on FreeBSD retrieves the process auxiliary vector via procstat_getauxv and scans it for AT_ENTRY. If procstat_getauxv fails, delve reports 'procstat_getauxv failed'. Without auxv the program entry address cannot be determined through this path.

Source

Thrown at pkg/proc/native/proc_freebsd.go:602

	ps, err := C.procstat_open_sysctl()
	if err != nil {
		return 0, fmt.Errorf("procstat_open_sysctl failed: %v", err)
	}
	defer C.procstat_close(ps)

	var count C.uint
	kipp, err := C.procstat_getprocs(ps, C.KERN_PROC_PID, C.int(dbp.pid), &count)
	if err != nil {
		return 0, fmt.Errorf("procstat_getprocs failed: %v", err)
	}
	defer C.procstat_freeprocs(ps, kipp)
	if count == 0 {
		return 0, errors.New("procstat_getprocs returned no processes")
	}

	auxv, err := C.procstat_getauxv(ps, kipp, &count)
	if err != nil {
		return 0, fmt.Errorf("procstat_getauxv failed: %v", err)
	}
	defer C.procstat_freeauxv(ps, auxv)

	for i := 0; i < int(count); i++ {
		if auxv.a_type == C.AT_ENTRY {
			return uint64(C.elf_aux_info_ptr(auxv)), nil
		}
		auxv = (*C.Elf_Auxinfo)(unsafe.Pointer(uintptr(unsafe.Pointer(auxv)) + unsafe.Sizeof(*auxv)))
	}
	return 0, errors.New("entry point not found")
}

func (dbp *nativeProcess) SupportsBPF() bool {
	return false
}

func (dbp *nativeProcess) SetUProbe(fnName string, goidOffset int64, args []ebpf.UProbeArgMap) error {
	panic("not implemented")

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Ensure FreeBSD 12+ where procstat_getauxv exists, and that delve was compiled against matching headers.
  2. Run as root/same user to satisfy kernel visibility restrictions.
  3. Fall back to parsing AT_ENTRY from /proc/<pid>/elf auxv or compute the ELF entry from the binary's program headers.
  4. Check the target is a normal alive process (not zombie/kernel process) before calling EntryPoint.

Example fix

// before
ep, err := proc.EntryPoint() // procstat_getauxv failed: ...

// after
ep, err := proc.EntryPoint()
if err != nil {
    if f, ferr := elf.Open(exePath); ferr == nil {
        ep = f.Entry // ELF header entry as fallback
        f.Close()
    }
}
Defensive patterns

Strategy: fallback

Validate before calling

// require FreeBSD 12+ auxv support before relying on EntryPoint
func auxvSupported() bool {
    ver, err := exec.Command("freebsd-version", "-u").Output()
    if err != nil { return false }
    major := strings.Split(strings.TrimSpace(string(ver)), ".")[0]
    n, _ := strconv.Atoi(major)
    return n >= 12
}

Try / catch

ep, err := proc.EntryPoint()
if err != nil && strings.Contains(err.Error(), "procstat_getauxv failed") {
    if f, ferr := elf.Open(exePath); ferr == nil {
        ep, err = f.Entry, nil // ELF program-header entry as fallback
        f.Close()
    }
}

Prevention

When it happens

Trigger: procstat_getauxv(ps, kipp, &count) returns an error when EntryPoint runs — the kernel did not expose the auxv for this process record (unsupported FreeBSD version, restricted access, or a kernel thread/ zombie with no auxv).

Common situations: Older FreeBSD (<12) without procstat_getauxv; debugging processes in jails with restricted sysctls; querying a just-exited or zombie process; kernels where PFLAGS tracing restricts auxv exposure.

Related errors


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