From 045763ef04ac0cdfeb646d08fbce982119fa51a2 Mon Sep 17 00:00:00 2001 From: aarzilli Date: Fri, 26 Jan 2018 15:48:47 +0100 Subject: [PATCH] terminal: do not crash when process exits during next Fixes #1090 --- pkg/terminal/command.go | 15 +++++++++++---- pkg/terminal/command_test.go | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pkg/terminal/command.go b/pkg/terminal/command.go index d75962a8..dbbf5a71 100644 --- a/pkg/terminal/command.go +++ b/pkg/terminal/command.go @@ -783,11 +783,18 @@ func scopePrefixSwitch(t *Term, ctx callContext) error { return nil } +func exitedToError(state *api.DebuggerState, err error) (*api.DebuggerState, error) { + if err == nil && state.Exited { + return nil, fmt.Errorf("Process has exited with status %d", state.ExitStatus) + } + return state, err +} + func step(t *Term, ctx callContext, args string) error { if err := scopePrefixSwitch(t, ctx); err != nil { return err } - state, err := t.client.Step() + state, err := exitedToError(t.client.Step()) if err != nil { printfileNoState(t) return err @@ -800,7 +807,7 @@ func stepInstruction(t *Term, ctx callContext, args string) error { if err := scopePrefixSwitch(t, ctx); err != nil { return err } - state, err := t.client.StepInstruction() + state, err := exitedToError(t.client.StepInstruction()) if err != nil { printfileNoState(t) return err @@ -814,7 +821,7 @@ func next(t *Term, ctx callContext, args string) error { if err := scopePrefixSwitch(t, ctx); err != nil { return err } - state, err := t.client.Next() + state, err := exitedToError(t.client.Next()) if err != nil { printfileNoState(t) return err @@ -827,7 +834,7 @@ func stepout(t *Term, ctx callContext, args string) error { if err := scopePrefixSwitch(t, ctx); err != nil { return err } - state, err := t.client.StepOut() + state, err := exitedToError(t.client.StepOut()) if err != nil { printfileNoState(t) return err diff --git a/pkg/terminal/command_test.go b/pkg/terminal/command_test.go index 8a86126a..17c885ff 100644 --- a/pkg/terminal/command_test.go +++ b/pkg/terminal/command_test.go @@ -717,3 +717,18 @@ func TestDisassembleAutogenerated(t *testing.T) { } }) } + +func TestIssue1090(t *testing.T) { + // Exit while executing 'next' should report the "Process exited" error + // message instead of crashing. + withTestTerminal("math", t, func(term *FakeTerminal) { + term.MustExec("break main.main") + term.MustExec("continue") + for { + _, err := term.Exec("next") + if err != nil && strings.Contains(err.Error(), " has exited with status ") { + break + } + } + }) +}