From 037926015a79a3c7ade328ec324381b0cc646266 Mon Sep 17 00:00:00 2001 From: aarzilli Date: Mon, 15 Feb 2016 16:14:07 +0100 Subject: [PATCH] proc: bugfix: propagate signals we don't handle to inferior Fixes #419 (partial) --- proc/proc_linux.go | 5 ++++- proc/proc_unix_test.go | 31 +++++++++++++++++++++++++++++++ proc/threads_linux.go | 8 ++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 proc/proc_unix_test.go diff --git a/proc/proc_linux.go b/proc/proc_linux.go index 8aad8fa9..fc5751e8 100644 --- a/proc/proc_linux.go +++ b/proc/proc_linux.go @@ -317,7 +317,10 @@ func (dbp *Process) trapWait(pid int) (*Thread, error) { } if th != nil { // TODO(dp) alert user about unexpected signals here. - if err := th.Continue(); err != nil { + if err := th.resumeWithSig(int(status.StopSignal())); err != nil { + if err == sys.ESRCH { + return nil, ProcessExitedError{Pid: dbp.Pid} + } return nil, err } } diff --git a/proc/proc_unix_test.go b/proc/proc_unix_test.go new file mode 100644 index 00000000..4168f87f --- /dev/null +++ b/proc/proc_unix_test.go @@ -0,0 +1,31 @@ +// +build linux darwin + +package proc + +import ( + "testing" + "time" + "syscall" + + protest "github.com/derekparker/delve/proc/test" +) + +func TestIssue419(t *testing.T) { + // SIGINT directed at the inferior should be passed along not swallowed by delve + withTestProcess("issue419", t, func(p *Process, fixture protest.Fixture) { + go func() { + for { + if p.Running() { + time.Sleep(2 * time.Second) + err := syscall.Kill(p.Pid, syscall.SIGINT) + assertNoError(err, t, "syscall.Kill") + return + } + } + }() + err := p.Continue() + if _, exited := err.(ProcessExitedError); !exited { + t.Fatalf("Unexpected error after Continue(): %v\n", err) + } + }) +} diff --git a/proc/threads_linux.go b/proc/threads_linux.go index 88a89adc..f1d649db 100644 --- a/proc/threads_linux.go +++ b/proc/threads_linux.go @@ -33,9 +33,13 @@ func (t *Thread) stopped() bool { return state == StatusTraceStop } -func (t *Thread) resume() (err error) { +func (t *Thread) resume() error { + return t.resumeWithSig(0) +} + +func (t *Thread) resumeWithSig(sig int) (err error) { t.running = true - t.dbp.execPtraceFunc(func() { err = PtraceCont(t.ID, 0) }) + t.dbp.execPtraceFunc(func() { err = PtraceCont(t.ID, sig) }) return } -- GitLab