go-delve/delve · error

cannot restart process Delve did not create

Error message

cannot restart process Delve did not create

What it means

RPCServer.Restart refuses to restart a target process that Delve attached to rather than launched. Restart requires re-executing the program, which is only possible when Delve created the process itself; an attached (already-running) process cannot be relaunched.

Solutions

  1. Detach and relaunch the program under 'dlv debug' or 'dlv exec' instead of attaching.
  2. Exit the debug session, rebuild/restart the process, and attach to the new PID.
  3. Use rerun workflows only for processes Delve launched.
  4. Check AttachPid in your client before offering a restart option in the UI.

Example fix

// before (client always shows restart)
call := svc.Restart(restartIn)
// after
if debuggerAttachPid == 0 {
    call := svc.Restart(restartIn)
} else {
    fmt.Println("restart unavailable: attached to an existing process")
}
Defensive patterns

Strategy: validation

Validate before calling

if attachPid != 0 {
    return errors.New("restart not available for attached processes")
}

Try / catch

var out rpc2.RestartOut
err := client.Call("RPCServer.Restart", in, &out)
if err != nil && strings.Contains(err.Error(), "Delve did not create") {
    // fall back to relaunch workflow outside Delve
}

Prevention

When it happens

Trigger: Calling the RPC Restart method (or 'restart' in a client) when the server was started with dlv attach, i.e. config.Debugger.AttachPid != 0.

Common situations: Developers debugging a running service via 'dlv attach <pid>' then issuing a restart command in the terminal or IDE expecting a re-launch.

Related errors


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

Appendix: source

Thrown at service/rpc2/server.go:96

	// When Rerecord is set the target will be rerecorded
	Rerecord bool

	// When Rebuild is set the process will be build again
	Rebuild bool

	NewRedirects [3]string
}

type RestartOut struct {
	DiscardedBreakpoints []api.DiscardedBreakpoint
}

// Restart restarts program.
func (s *RPCServer) Restart(arg RestartIn, cb service.RPCCallback) {
	close(cb.SetupDoneChan())
	if s.config.Debugger.AttachPid != 0 {
		cb.Return(nil, errors.New("cannot restart process Delve did not create"))
		return
	}
	var out RestartOut
	var err error
	out.DiscardedBreakpoints, err = s.debugger.Restart(arg.Rerecord, arg.Position, arg.ResetArgs, arg.NewArgs, arg.NewRedirects, arg.Rebuild)
	cb.Return(out, err)
}

type StateIn struct {
	// If NonBlocking is true State will return immediately even if the target process is running.
	NonBlocking bool
}

type StateOut struct {
	State *api.DebuggerState
}

// State returns the current debugger state.

View on GitHub (pinned to a23773e6c3)