This is the mail archive of the mailing list for the GDB project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Stop breakpoint commands from poping the target

This patch goes on top of Vladimir's pending async fixes patch.

commands.exp triggers the problem this patch addresses, in
async mode.

In that test, we have a watch on a local variable, and then we
add a command to that watch to print the local variable's
value.  When the variable goes out of scope, gdb prints that,
and also runs the associated commands with the watch.  Since
the variable is out of scope, and error is thrown.  In sync
targets, the exception just ends the breakpoints command
processing, and goes on to proceed with the command loop.  But in
async mode, the exception ends up in
inf-loop.c:inferior_event_handler/INF_REG_EVENT, which considers exceptions
fatal, and pops the target.  The fix is to catch the exception earlier.

Imagine the following command list associated with a breakpoint:
  info target

As and example, in sync mode, trying to execute
non_existing_command causes an error that stops the
interpreting of all subsequent commands, hence info target is
never executed.  The patch installs the same behaviour for
async targets.

commands.exp passes cleanly with the linux native async patch
I'll post next.

Pedro Alves
2008-03-14  Pedro Alves  <>

	* top.c (bpstat_do_actions_wrapper): New.
	(command_line_handler_continuation): Wrap call to
	bpstat_do_actions in catch_errors.

 gdb/top.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

Index: src/gdb/top.c
--- src.orig/gdb/top.c	2008-03-14 07:10:51.000000000 +0000
+++ src/gdb/top.c	2008-03-14 07:22:10.000000000 +0000
@@ -364,6 +364,14 @@ do_chdir_cleanup (void *old_dir)
+static int
+bpstat_do_actions_wrapper (void *arg)
+  bpstat *bsp = arg;
+  bpstat_do_actions (bsp);
+  return 1;
 /* Do any commands attached to breakpoint we stopped at. Only if we
    are always running synchronously. Or if we have just executed a
    command that doesn't start the target. */
@@ -376,7 +384,12 @@ command_line_handler_continuation (struc
   long time_at_cmd_start  = arg->data.longint;
   long space_at_cmd_start = arg->next->data.longint;
-  bpstat_do_actions (&stop_bpstat);
+  /* Don't let exceptions escape into
+     inferior_event_handler/INF_REG_EVENT, as that pops the
+     target.  */
+  catch_errors (bpstat_do_actions_wrapper, (void *) &stop_bpstat,
   /*do_cleanups (old_chain); *//*?????FIXME????? */
   if (display_time)
@@ -542,7 +555,7 @@ execute_command (char *p, int from_tty)
-  /* Set things up for this function to be compete later, once the
+  /* Set things up for this function to be finished later, once the
      execution has completed, if we are doing an execution command,
      otherwise, just go ahead and finish. */
   if (target_can_async_p () && target_executing)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]