aboutsummaryrefslogtreecommitdiff
path: root/gdb/inf-loop.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2008-05-06 18:49:19 +0000
committerPedro Alves <palves@redhat.com>2008-05-06 18:49:19 +0000
commit02b19d84634b886502f86700748971b42dc77465 (patch)
treeb1475ce9c42ed0ed8f0f91c990d9d5d940dd367e /gdb/inf-loop.c
parent15c1e57ffbcb27cd275429e689f509026bda698b (diff)
downloadgdb-02b19d84634b886502f86700748971b42dc77465.zip
gdb-02b19d84634b886502f86700748971b42dc77465.tar.gz
gdb-02b19d84634b886502f86700748971b42dc77465.tar.bz2
* inf-loop.c (inferior_event_handler): Run all continuations and
print any language change before running the breakpoint commands.
Diffstat (limited to 'gdb/inf-loop.c')
-rw-r--r--gdb/inf-loop.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/gdb/inf-loop.c b/gdb/inf-loop.c
index 4889c6f..f77bc65 100644
--- a/gdb/inf-loop.c
+++ b/gdb/inf-loop.c
@@ -92,30 +92,35 @@ inferior_event_handler (enum inferior_event_type event_type,
was_sync = sync_execution;
async_enable_stdin ();
- /* If there's an error doing breakpoint commands, we don't
- want to throw -- continuation might still do something. */
- TRY_CATCH (e, RETURN_MASK_ALL)
- {
- bpstat_do_actions (&stop_bpstat);
- }
/* If we were doing a multi-step (eg: step n, next n), but it
got interrupted by a breakpoint, still do the pending
continuations. The continuation itself is responsible for
- distinguishing the cases. */
+ distinguishing the cases. The continuations are allowed to
+ touch the inferior memory, e.g. to remove breakpoints, so run
+ them before running breakpoint commands, which may resume the
+ target. */
do_all_intermediate_continuations (0);
+ /* Always finish the previous command before running any
+ breakpoint commands. Any stop cancels the previous command.
+ E.g. a "finish" or "step-n" command interrupted by an
+ unrelated breakpoint is canceled. */
do_all_continuations (0);
- if (current_language != expected_language)
+ if (current_language != expected_language
+ && language_mode == language_mode_auto)
+ language_info (1); /* Print what changed. */
+
+ /* Don't propagate breakpoint commands errors. Either we're
+ stopping or some command resumes the inferior. The user will
+ be informed. */
+ TRY_CATCH (e, RETURN_MASK_ALL)
{
- if (language_mode == language_mode_auto)
- {
- language_info (1); /* Print what changed. */
- }
+ bpstat_do_actions (&stop_bpstat);
}
- /* If the continuation did not start the target again,
- prepare for interation with the user. */
+ /* If no breakpoint command resumed the inferior, prepare for
+ interaction with the user. */
if (!target_executing)
{
if (was_sync)