This is the mail archive of the gdb-patches@sourceware.org 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]

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"

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