From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1610 invoked by alias); 14 Mar 2008 08:02:45 -0000 Received: (qmail 1590 invoked by uid 22791); 14 Mar 2008 08:02:45 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 14 Mar 2008 08:02:27 +0000 Received: (qmail 27900 invoked from network); 14 Mar 2008 08:02:25 -0000 Received: from unknown (HELO orlando) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 14 Mar 2008 08:02:25 -0000 From: Pedro Alves Subject: Stop breakpoint commands from poping the target Date: Fri, 14 Mar 2008 08:02:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) MIME-Version: 1.0 To: gdb-patches@sourceware.org Content-Type: Multipart/Mixed; boundary="Boundary-00=_aEj2Hhw1GmkQc8J" Message-Id: <200803140802.34377.pedro@codesourcery.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-03/txt/msg00161.txt.bz2 --Boundary-00=_aEj2Hhw1GmkQc8J Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1185 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: non_existing_command 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 --Boundary-00=_aEj2Hhw1GmkQc8J Content-Type: text/x-diff; charset="utf-8"; name="bpstat_do_actions_dont_escape_exception.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="bpstat_do_actions_dont_escape_exception.diff" Content-length: 1713 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) } #endif +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, + "", RETURN_MASK_ALL); + /*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) --Boundary-00=_aEj2Hhw1GmkQc8J--