From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24254 invoked by alias); 9 Sep 2008 18:28:19 -0000 Received: (qmail 24246 invoked by uid 22791); 9 Sep 2008 18:28:18 -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; Tue, 09 Sep 2008 18:27:24 +0000 Received: (qmail 16029 invoked from network); 9 Sep 2008 18:27:22 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 9 Sep 2008 18:27:22 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: unbreak execution commands in hook-stop Date: Tue, 09 Sep 2008 18:28:00 -0000 User-Agent: KMail/1.9.9 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_JAsxIBGCFSqW594" Message-Id: <200809091927.21008.pedro@codesourcery.com> X-IsSubscribed: yes 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-09/txt/msg00193.txt.bz2 --Boundary-00=_JAsxIBGCFSqW594 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 841 Hi, This patch unbreaks issuing execution commands from a hook-stop: (top-gdb) define hook-stop Type commands for definition of "hook-stop". End with a line saying just "end". >continue >end (top-gdb) start Temporary breakpoint 3 at 0x44f027: file ../../src/gdb/gdb.c, line 28. Starting program: /home/pedro/gdb/baseline/build/gdb/gdb [Thread debugging using libthread_db enabled] Error while running hook_stop: Cannot execute this command while the selected thread is running. The issue is that we're running the hook-stop before tagging the threads as stopped (and before other things, like fixing the selected frame, storing registers for the finish command or an inferior function call). Fixed by running the hook-stop after all those things. New test included. Tested on x86_64-unknown-linux-gnu. OK? -- Pedro Alves --Boundary-00=_JAsxIBGCFSqW594 Content-Type: text/x-diff; charset="utf-8"; name="hook_stop.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="hook_stop.diff" Content-length: 5374 gdb/ 2008-09-09 Pedro Alves * infrun.c (normal_stop): Run hook-stop last. gdb/testsuite/ 2008-09-09 Pedro Alves * gdb.base/hook-stop-continue.c: New. * gdb.base/hook-stop-continue.exp: New. --- gdb/infrun.c | 18 +++---- gdb/testsuite/gdb.base/hook-stop-continue.c | 42 ++++++++++++++++++ gdb/testsuite/gdb.base/hook-stop-continue.exp | 59 ++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 10 deletions(-) Index: src/gdb/infrun.c =================================================================== --- src.orig/gdb/infrun.c 2008-09-09 18:45:33.000000000 +0100 +++ src/gdb/infrun.c 2008-09-09 18:45:46.000000000 +0100 @@ -3847,17 +3847,8 @@ Further execution is probably impossible if (target_has_stack && !stop_stack_dummy) set_current_sal_from_frame (get_current_frame (), 1); - /* Look up the hook_stop and run it (CLI internally handles problem - of stop_command's pre-hook not existing). */ - if (stop_command) - catch_errors (hook_stop_stub, stop_command, - "Error while running hook_stop:\n", RETURN_MASK_ALL); - if (!target_has_stack) - { - - goto done; - } + goto done; if (last.kind == TARGET_WAITKIND_SIGNALLED || last.kind == TARGET_WAITKIND_EXITED) @@ -4010,6 +4001,13 @@ done: else set_running (inferior_ptid, 0); } + + /* Look up the hook_stop and run it (CLI internally handles problem + of stop_command's pre-hook not existing). */ + if (stop_command) + catch_errors (hook_stop_stub, stop_command, + "Error while running hook_stop:\n", RETURN_MASK_ALL); + } static int Index: src/gdb/testsuite/gdb.base/hook-stop-continue.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gdb/testsuite/gdb.base/hook-stop-continue.c 2008-09-09 18:48:08.000000000 +0100 @@ -0,0 +1,42 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +funbreak (int i) +{ + i = i * 2; /* set breakpoint here */ + i = i + 10; + return i; +} + +int +func (int i) +{ + return i * 2; +} + +int +main (int argc, char **argv, char **envp) +{ + func (1); + func (2); + func (3); + func (4); + funbreak (5); + + return 0; +} Index: src/gdb/testsuite/gdb.base/hook-stop-continue.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gdb/testsuite/gdb.base/hook-stop-continue.exp 2008-09-09 18:44:23.000000000 +0100 @@ -0,0 +1,59 @@ +# Copyright 2008 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set testfile "hook-stop-continue" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [prepare_for_testing ${testfile}.exp "${testfile}" "${testfile}.c" {debug nowarnings}] } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "Couldn't run to main" +} + +set bp_location [gdb_get_line_number "set breakpoint here"] + +gdb_test "break $bp_location" \ + "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ + "breakpoint line number" + +gdb_test "print \$do_continue = 1" "1" + +send_gdb "define hook-stop\n" +gdb_expect { + -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "if \$do_continue\nset \$do_continue = 0\ncontinue\nend\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define hook-stop command"} + timeout {fail "(timeout) define hook-stop command"} + } + } + -re "$gdb_prompt $"\ + {fail "define hook-stop command"} + timeout {fail "(timeout) define hook-stop command"} +} + +gdb_test "next" "Breakpoint.*funbreak \\(i=5\\) at .*:$bp_location\r\n$bp_location.*set breakpoint here \\*/" \ + "next triggering hook-stop" + +gdb_test "next" "i = i \\+ 10;" "next no hook-stop" --Boundary-00=_JAsxIBGCFSqW594--