mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 18:57:18 +08:00 
			
		
		
		
	proc: bugfix: propagate signals we don't handle to inferior
Fixes #419 (partial)
This commit is contained in:
		| @ -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 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 aarzilli
					aarzilli