go-delve/delve · error
could not attach to pid %d: already being debugged by pid %d
Error message
could not attach to pid %d: already being debugged by pid %d
What it means
The target process is already being traced by another debugger: /proc/<pid>/status shows a non-zero TracerPid. A process can only have one ptrace tracer at a time, so the attach is rejected with the tracing debugger's pid.
Source
Thrown at service/debugger/debugger_linux.go:52
}
if fi.Sys().(*syscall.Stat_t).Uid != uint32(os.Getuid()) {
return fmt.Errorf("Could not attach to pid %d: current user does not own the process", pid)
}
// check if the process is already being traced
statusfh, err := os.Open(fmt.Sprintf("/proc/%d/status", pid))
if err != nil {
return fallbackerr
}
defer statusfh.Close()
scan := bufio.NewScanner(statusfh)
const tracerPidPrefix = "TracerPid:"
for scan.Scan() {
line := scan.Text()
if strings.HasPrefix(line, tracerPidPrefix) {
tpid, _ := strconv.Atoi(strings.TrimSpace(line[len(tracerPidPrefix):]))
if tpid != 0 {
return fmt.Errorf("could not attach to pid %d: already being debugged by pid %d", pid, tpid)
}
}
}
}
}
return fallbackerr
}
View on GitHub (pinned to a23773e6c3)
Solutions
- Detach or close the other debugger session (its pid is in the error message)
- Kill the other tracer process: kill <tracerPid>
- Check with: cat /proc/<pid>/status | grep TracerPid before attaching
- Retry attach once the TracerPid becomes 0
Example fix
// before dlv attach 12345 // already traced by pid 999 // after (shell) kill 999 dlv attach 12345
Defensive patterns
Strategy: validation
Validate before calling
out, _ := os.ReadFile(fmt.Sprintf("/proc/%d/status", pid))
alreadyTraced := strings.Contains(string(out), "TracerPid:\t0") == false Try / catch
err := debugger.Attach(pid, []string{}, nil)
if err != nil && strings.Contains(err.Error(), "already being debugged") {
// detach/kill the tracer pid parsed from the message, then retry once
} Prevention
- Check TracerPid in /proc/<pid>/status before attaching
- Ensure previous debug sessions detach on exit (no orphan strace/gdb)
- Serialize access to the debug target across the team/tooling
- Automate cleanup of stale tracer processes
When it happens
Trigger: 'dlv attach <pid>' while another delve/gdb/strace session already has the process attached (TracerPid: <tpid> in /proc/<pid>/status).
Common situations: Two developers attaching to the same dev server; a forgotten strace or previous delve session left attached; IDE debug session still open holding the process.
Related errors
- could not attach to pid %d: %s
- process must be stopped in order to kill it
- waiting for target execve failed: %s
- could not read proc stat: %v
- no match found using regexp '%s' in /proc/%d/stat
AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31).
Data as JSON: /api/errors/be2ccfc8361af61a.
Report an issue: GitHub.