proc/gdbserial: shut down debuggee when failing to debug (#2953)

Co-authored-by: Polina Sokolova <polinasok@users.noreply.github.com>
This commit is contained in:
polinasok 2022-04-01 10:31:23 -07:00 committed by GitHub
parent 6c368b78a9
commit 0b71eeca40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 4 deletions

@ -282,8 +282,10 @@ func TestContinue(t *testing.T) {
// TestChildProcessExitWhenNoDebugInfo verifies that the child process exits when dlv launch the binary without debug info // TestChildProcessExitWhenNoDebugInfo verifies that the child process exits when dlv launch the binary without debug info
func TestChildProcessExitWhenNoDebugInfo(t *testing.T) { func TestChildProcessExitWhenNoDebugInfo(t *testing.T) {
noDebugFlags := protest.LinkStrip
// -s doesn't strip symbols on Mac, use -w instead
if runtime.GOOS == "darwin" { if runtime.GOOS == "darwin" {
t.Skip("test skipped on darwin, see https://github.com/go-delve/delve/pull/2018 for details") noDebugFlags = protest.LinkDisableDWARF
} }
if _, err := exec.LookPath("ps"); err != nil { if _, err := exec.LookPath("ps"); err != nil {
@ -293,7 +295,7 @@ func TestChildProcessExitWhenNoDebugInfo(t *testing.T) {
dlvbin, tmpdir := getDlvBin(t) dlvbin, tmpdir := getDlvBin(t)
defer os.RemoveAll(tmpdir) defer os.RemoveAll(tmpdir)
fix := protest.BuildFixture("http_server", protest.LinkStrip) fix := protest.BuildFixture("http_server", noDebugFlags)
// dlv exec the binary file and expect error. // dlv exec the binary file and expect error.
out, err := exec.Command(dlvbin, "exec", "--headless", "--log", fix.Path).CombinedOutput() out, err := exec.Command(dlvbin, "exec", "--headless", "--log", fix.Path).CombinedOutput()
@ -700,6 +702,58 @@ func TestDAPCmd(t *testing.T) {
cmd.Wait() cmd.Wait()
} }
func TestDAPCmdWithNoDebugBinary(t *testing.T) {
const listenAddr = "127.0.0.1:40579"
dlvbin, tmpdir := getDlvBin(t)
defer os.RemoveAll(tmpdir)
cmd := exec.Command(dlvbin, "dap", "--log", "--listen", listenAddr)
stdout, err := cmd.StdoutPipe()
assertNoError(err, t, "stdout pipe")
defer stdout.Close()
stderr, err := cmd.StderrPipe()
assertNoError(err, t, "stderr pipe")
defer stderr.Close()
assertNoError(cmd.Start(), t, "start dap instance")
scanOut := bufio.NewScanner(stdout)
scanErr := bufio.NewScanner(stderr)
// Wait for the debug server to start
scanOut.Scan()
listening := "DAP server listening at: " + listenAddr
if scanOut.Text() != listening {
cmd.Process.Kill() // release the port
t.Fatalf("Unexpected stdout:\ngot %q\nwant %q", scanOut.Text(), listening)
}
go func() { // Capture logging
for scanErr.Scan() {
t.Log(scanErr.Text())
}
}()
// Exec the stripped debuggee and expect things to fail
noDebugFlags := protest.LinkStrip
// -s doesn't strip symbols on Mac, use -w instead
if runtime.GOOS == "darwin" {
noDebugFlags = protest.LinkDisableDWARF
}
fixture := protest.BuildFixture("increment", noDebugFlags)
go func() {
for scanOut.Scan() {
t.Errorf("Unexpected stdout: %s", scanOut.Text())
}
}()
client := daptest.NewClient(listenAddr)
client.LaunchRequest("exec", fixture.Path, false)
client.ExpectErrorResponse(t)
client.DisconnectRequest()
client.ExpectDisconnectResponse(t)
client.ExpectTerminatedEvent(t)
client.Close()
cmd.Wait()
}
func newDAPRemoteClient(t *testing.T, addr string) *daptest.Client { func newDAPRemoteClient(t *testing.T, addr string) *daptest.Client {
c := daptest.NewClient(addr) c := daptest.NewClient(addr)
c.AttachRequest(map[string]interface{}{"mode": "remote", "stopOnEntry": true}) c.AttachRequest(map[string]interface{}{"mode": "remote", "stopOnEntry": true})

@ -711,7 +711,7 @@ func (p *gdbProcess) initialize(path string, debugInfoDirs []string, stopReason
StopReason: stopReason, StopReason: stopReason,
CanDump: runtime.GOOS == "darwin"}) CanDump: runtime.GOOS == "darwin"})
if err != nil { if err != nil {
p.conn.conn.Close() p.Detach(true)
return nil, err return nil, err
} }
return tgt, nil return tgt, nil

@ -78,6 +78,8 @@ const (
BuildModePlugin BuildModePlugin
BuildModeExternalLinker BuildModeExternalLinker
AllNonOptimized AllNonOptimized
// LinkDisableDWARF enables '-ldflags="-w"'.
LinkDisableDWARF
) )
// BuildFixture will compile the fixture 'name' using the provided build flags. // BuildFixture will compile the fixture 'name' using the provided build flags.
@ -114,9 +116,14 @@ func BuildFixture(name string, flags BuildFlags) Fixture {
// Work-around for https://github.com/golang/go/issues/13154 // Work-around for https://github.com/golang/go/issues/13154
buildFlags = append(buildFlags, "-ldflags=-linkmode internal") buildFlags = append(buildFlags, "-ldflags=-linkmode internal")
} }
ldflagsv := []string{}
if flags&LinkStrip != 0 { if flags&LinkStrip != 0 {
buildFlags = append(buildFlags, "-ldflags=-s") ldflagsv = append(ldflagsv, "-s")
} }
if flags&LinkDisableDWARF != 0 {
ldflagsv = append(ldflagsv, "-w")
}
buildFlags = append(buildFlags, "-ldflags="+strings.Join(ldflagsv, " "))
gcflagsv := []string{} gcflagsv := []string{}
if flags&EnableInlining == 0 { if flags&EnableInlining == 0 {
gcflagsv = append(gcflagsv, "-l") gcflagsv = append(gcflagsv, "-l")