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
- Ensure FreeBSD 12+ where procstat_getauxv exists, and that delve was compiled against matching headers.
- Run as root/same user to satisfy kernel visibility restrictions.
- Fall back to parsing AT_ENTRY from /proc/<pid>/elf auxv or compute the ELF entry from the binary's program headers.
- 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
- Run on FreeBSD 12+ where procstat_getauxv exists.
- Compile delve against the matching libprocstat headers.
- Run as root/same user to satisfy kernel exposure restrictions.
- Skip EntryPoint queries for zombies/kernel processes.
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
- procstat_open_sysctl failed: %v
- procstat_getprocs failed: %v
- procstat_getprocs returned no processes
- entry point not found
- kinfo_getvmmap call failed
AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31).
Data as JSON: /api/errors/978ecee22ebd13b5.
Report an issue: GitHub.