未验证 提交 d61bf018 编写于 作者: A Alessandro Arzilli 提交者: GitHub

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: Na <a@kra>
上级 24ec1754
......@@ -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")
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册