debugger: report error when switching goroutine is impossible (#2424)
Due to variable shadowing the SwitchGoroutine command never failed.
This commit is contained in:
parent
ea9541b860
commit
6a85f34966
@ -1023,14 +1023,16 @@ func stoppedGoroutineID(state *api.DebuggerState) (id int) {
|
|||||||
|
|
||||||
func (s *Server) doStepCommand(command string, threadId int) {
|
func (s *Server) doStepCommand(command string, threadId int) {
|
||||||
// Use SwitchGoroutine to change the current goroutine.
|
// Use SwitchGoroutine to change the current goroutine.
|
||||||
state, err := s.debugger.Command(&api.DebuggerCommand{Name: api.SwitchGoroutine, GoroutineID: threadId}, nil)
|
_, err := s.debugger.Command(&api.DebuggerCommand{Name: api.SwitchGoroutine, GoroutineID: threadId}, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Errorf("Error switching goroutines while stepping: %e", err)
|
s.log.Errorf("Error switching goroutines while stepping: %v", err)
|
||||||
// If we encounter an error, we will have to send a stopped event
|
// If we encounter an error, we will have to send a stopped event
|
||||||
// since we already sent the step response.
|
// since we already sent the step response.
|
||||||
stopped := &dap.StoppedEvent{Event: *newEvent("stopped")}
|
stopped := &dap.StoppedEvent{Event: *newEvent("stopped")}
|
||||||
stopped.Body.AllThreadsStopped = true
|
stopped.Body.AllThreadsStopped = true
|
||||||
if state != nil {
|
if state, err := s.debugger.State(false); err != nil {
|
||||||
|
s.log.Errorf("Error retrieving state: %e", err)
|
||||||
|
} else {
|
||||||
stopped.Body.ThreadId = stoppedGoroutineID(state)
|
stopped.Body.ThreadId = stoppedGoroutineID(state)
|
||||||
}
|
}
|
||||||
stopped.Body.Reason = "error"
|
stopped.Body.Reason = "error"
|
||||||
|
|||||||
@ -2202,9 +2202,12 @@ func TestNextAndStep(t *testing.T) {
|
|||||||
client.ExpectStepInResponse(t)
|
client.ExpectStepInResponse(t)
|
||||||
expectStop("main.inlineThis", 5)
|
expectStop("main.inlineThis", 5)
|
||||||
|
|
||||||
client.NextRequest(-10000 /*this is ignored*/)
|
client.NextRequest(-1000)
|
||||||
client.ExpectNextResponse(t)
|
client.ExpectNextResponse(t)
|
||||||
expectStop("main.inlineThis", 6)
|
if se := client.ExpectStoppedEvent(t); se.Body.Reason != "error" || se.Body.Text != "unknown goroutine -1000" {
|
||||||
|
t.Errorf("got %#v, want Reaspon=\"error\", Text=\"unknown goroutine -1000\"", se)
|
||||||
|
}
|
||||||
|
handleStop(t, client, 1, "main.inlineThis", 5)
|
||||||
},
|
},
|
||||||
disconnect: false,
|
disconnect: false,
|
||||||
}})
|
}})
|
||||||
|
|||||||
@ -1095,7 +1095,8 @@ func (d *Debugger) Command(command *api.DebuggerCommand, resumeNotify chan struc
|
|||||||
withBreakpointInfo = false
|
withBreakpointInfo = false
|
||||||
case api.SwitchGoroutine:
|
case api.SwitchGoroutine:
|
||||||
d.log.Debugf("switching to goroutine %d", command.GoroutineID)
|
d.log.Debugf("switching to goroutine %d", command.GoroutineID)
|
||||||
g, err := proc.FindGoroutine(d.target, command.GoroutineID)
|
var g *proc.G
|
||||||
|
g, err = proc.FindGoroutine(d.target, command.GoroutineID)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = d.target.SwitchGoroutine(g)
|
err = d.target.SwitchGoroutine(g)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user