Return exit status with DebuggerState

This commit is contained in:
Derek Parker 2015-07-03 14:18:03 -05:00
parent dcfa1aea2b
commit d2b8d57053
4 changed files with 21 additions and 15 deletions

@ -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)