This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
unbreak execution commands in hook-stop
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 9 Sep 2008 19:27:20 +0100
- Subject: unbreak execution commands in hook-stop
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
gdb/
2008-09-09 Pedro Alves <pedro@codesourcery.com>
* infrun.c (normal_stop): Run hook-stop last.
gdb/testsuite/
2008-09-09 Pedro Alves <pedro@codesourcery.com>
* 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 <http://www.gnu.org/licenses/>. */
+
+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 <http://www.gnu.org/licenses/>.
+
+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"