* unbreak execution commands in hook-stop
@ 2008-09-09 18:28 Pedro Alves
2008-09-09 18:37 ` Daniel Jacobowitz
0 siblings, 1 reply; 2+ messages in thread
From: Pedro Alves @ 2008-09-09 18:28 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 841 bytes --]
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
[-- Attachment #2: hook_stop.diff --]
[-- Type: text/x-diff, Size: 5374 bytes --]
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"
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: unbreak execution commands in hook-stop
2008-09-09 18:28 unbreak execution commands in hook-stop Pedro Alves
@ 2008-09-09 18:37 ` Daniel Jacobowitz
0 siblings, 0 replies; 2+ messages in thread
From: Daniel Jacobowitz @ 2008-09-09 18:37 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
On Tue, Sep 09, 2008 at 07:27:20PM +0100, Pedro Alves wrote:
> 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.
OK.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-09-09 18:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-09-09 18:28 unbreak execution commands in hook-stop Pedro Alves
2008-09-09 18:37 ` Daniel Jacobowitz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox