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:
parent
24ec1754b2
commit
d61bf018f0
@ -407,7 +407,9 @@ func (d *Debugger) FunctionReturnLocations(fnName string) ([]uint64, error) {
|
|||||||
func (d *Debugger) Detach(kill bool) error {
|
func (d *Debugger) Detach(kill bool) error {
|
||||||
d.targetMutex.Lock()
|
d.targetMutex.Lock()
|
||||||
defer d.targetMutex.Unlock()
|
defer d.targetMutex.Unlock()
|
||||||
|
if ok, _ := d.target.Valid(); !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return d.detach(kill)
|
return d.detach(kill)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"net/rpc"
|
"net/rpc"
|
||||||
"net/rpc/jsonrpc"
|
"net/rpc/jsonrpc"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -2111,3 +2112,55 @@ func TestIssue2162(t *testing.T) {
|
|||||||
assertNoError(err, t, "Step()")
|
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")
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user