Return exit status with DebuggerState
This commit is contained in:
parent
dcfa1aea2b
commit
d2b8d57053
@ -10,7 +10,8 @@ type DebuggerState struct {
|
||||
// Information requested by the current breakpoint
|
||||
BreakpointInfo *BreakpointInfo `json:"breakPointInfo,omitrempty"`
|
||||
// Exited indicates whether the debugged process has exited.
|
||||
Exited bool `json:"exited"`
|
||||
Exited bool `json:"exited"`
|
||||
ExitStatus int `json:"exitStatus"`
|
||||
|
||||
// Filled by RPCClient.Continue, indicates an error
|
||||
Err error `json:"-"`
|
||||
|
@ -1,6 +1,7 @@
|
||||
package debugger
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"regexp"
|
||||
@ -169,21 +170,19 @@ func (d *Debugger) Command(command *api.DebuggerCommand) (*api.DebuggerState, er
|
||||
case api.Continue:
|
||||
log.Print("continuing")
|
||||
err = d.process.Continue()
|
||||
state, stateErr := d.State()
|
||||
if stateErr != nil {
|
||||
return state, stateErr
|
||||
}
|
||||
if err != nil {
|
||||
if exitedErr, exited := err.(proc.ProcessExitedError); exited {
|
||||
state, err := d.State()
|
||||
if err != nil {
|
||||
return state, err
|
||||
}
|
||||
return state, exitedErr
|
||||
state.Exited = true
|
||||
state.ExitStatus = exitedErr.Status
|
||||
state.Err = errors.New(exitedErr.Error())
|
||||
return state, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
state, err := d.State()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = d.collectBreakpointInformation(state)
|
||||
return state, err
|
||||
|
||||
|
@ -41,13 +41,19 @@ func (c *RPCClient) GetState() (*api.DebuggerState, error) {
|
||||
return state, err
|
||||
}
|
||||
|
||||
func (c *RPCClient) Continue() <- chan *api.DebuggerState {
|
||||
func (c *RPCClient) Continue() <-chan *api.DebuggerState {
|
||||
ch := make(chan *api.DebuggerState)
|
||||
go func() {
|
||||
for {
|
||||
state := new(api.DebuggerState)
|
||||
err := c.call("Command", &api.DebuggerCommand{Name: api.Continue}, state)
|
||||
state.Err = err
|
||||
if err != nil {
|
||||
state.Err = err
|
||||
}
|
||||
if state.Exited {
|
||||
// Error types apparantly cannot be marshalled by Go correctly. Must reset error here.
|
||||
state.Err = fmt.Errorf("Process %d has exited with status %d", c.ProcessPid(), state.ExitStatus)
|
||||
}
|
||||
ch <- state
|
||||
if err != nil || state.Breakpoint == nil || !state.Breakpoint.Tracepoint {
|
||||
close(ch)
|
||||
|
@ -70,8 +70,8 @@ func TestClientServer_exit(t *testing.T) {
|
||||
t.Fatalf("Expected exited %v, got %v", e, a)
|
||||
}
|
||||
state = <-c.Continue()
|
||||
if state.Err != nil {
|
||||
t.Fatalf("Error after continue: %v\n", err)
|
||||
if state.Err == nil {
|
||||
t.Fatalf("Error expected after continue")
|
||||
}
|
||||
if !state.Exited {
|
||||
t.Fatalf("Expected exit after continue: %v", state)
|
||||
|
Loading…
Reference in New Issue
Block a user