proc: bugfix: propagate signals we don't handle to inferior
Fixes #419 (partial)
This commit is contained in:
parent
63a660820e
commit
037926015a
@ -317,7 +317,10 @@ func (dbp *Process) trapWait(pid int) (*Thread, error) {
|
|||||||
}
|
}
|
||||||
if th != nil {
|
if th != nil {
|
||||||
// TODO(dp) alert user about unexpected signals here.
|
// 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
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
31
proc/proc_unix_test.go
Normal file
31
proc/proc_unix_test.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
@ -33,9 +33,13 @@ func (t *Thread) stopped() bool {
|
|||||||
return state == StatusTraceStop
|
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.running = true
|
||||||
t.dbp.execPtraceFunc(func() { err = PtraceCont(t.ID, 0) })
|
t.dbp.execPtraceFunc(func() { err = PtraceCont(t.ID, sig) })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user