debugger: check that target is valid when detaching (#2263)

Do not call detach if the target is no longer valid.

Fixes #2259

Co-authored-by: a <a@kra>
This commit is contained in:
Alessandro Arzilli 2020-12-15 17:13:13 +01:00 committed by GitHub
parent 24ec1754b2
commit d61bf018f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 1 deletions

@ -407,7 +407,9 @@ func (d *Debugger) FunctionReturnLocations(fnName string) ([]uint64, error) {
func (d *Debugger) Detach(kill bool) error {
d.targetMutex.Lock()
defer d.targetMutex.Unlock()
if ok, _ := d.target.Valid(); !ok {
return nil
}
return d.detach(kill)
}

@ -9,6 +9,7 @@ import (
"net/rpc"
"net/rpc/jsonrpc"
"os"
"os/exec"
"path/filepath"
"reflect"
"runtime"
@ -2111,3 +2112,55 @@ func TestIssue2162(t *testing.T) {
assertNoError(err, t, "Step()")
})
}
func TestDetachLeaveRunning(t *testing.T) {
// See https://github.com/go-delve/delve/issues/2259
if testBackend == "rr" {
return
}
listener, clientConn := service.ListenerPipe()
defer listener.Close()
var buildFlags protest.BuildFlags
if buildMode == "pie" {
buildFlags |= protest.BuildModePIE
}
fixture := protest.BuildFixture("testnextnethttp", buildFlags)
cmd := exec.Command(fixture.Path)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
assertNoError(cmd.Start(), t, "starting fixture")
defer cmd.Process.Kill()
// wait for testnextnethttp to start listening
t0 := time.Now()
for {
conn, err := net.Dial("tcp", "127.0.0.1:9191")
if err == nil {
conn.Close()
break
}
time.Sleep(50 * time.Millisecond)
if time.Since(t0) > 10*time.Second {
t.Fatal("fixture did not start")
}
}
server := rpccommon.NewServer(&service.Config{
Listener: listener,
APIVersion: 2,
Debugger: debugger.Config{
AttachPid: cmd.Process.Pid,
WorkingDir: ".",
Backend: testBackend,
},
})
if err := server.Run(); err != nil {
t.Fatal(err)
}
client := rpc2.NewClientFromConn(clientConn)
defer server.Stop()
assertNoError(client.Detach(false), t, "Detach")
}