diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2ec5adfb93..848e00e310 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2008-09-09 Pedro Alves + + * infrun.c (normal_stop): Run hook-stop last. + 2008-09-09 Pedro Alves * gnu-nat.c (gnu_pid_to_exec_file): Delete. diff --git a/gdb/infrun.c b/gdb/infrun.c index ede6309441..62c4ab3e84 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3799,17 +3799,8 @@ Further execution is probably impossible.\n")); 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) @@ -3962,6 +3953,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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 59b26a4dd6..f078b703c2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-09 Pedro Alves + + * gdb.base/hook-stop-continue.c: New. + * gdb.base/hook-stop-continue.exp: New. + 2008-09-08 Daniel Jacobowitz * gdb.base/structs3.c, gdb.base/structs3.exp: New files. diff --git a/gdb/testsuite/gdb.base/hook-stop-continue.c b/gdb/testsuite/gdb.base/hook-stop-continue.c new file mode 100644 index 0000000000..a769c4100a --- /dev/null +++ b/gdb/testsuite/gdb.base/hook-stop-continue.c @@ -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; +} diff --git a/gdb/testsuite/gdb.base/hook-stop-continue.exp b/gdb/testsuite/gdb.base/hook-stop-continue.exp new file mode 100644 index 0000000000..524ef681a7 --- /dev/null +++ b/gdb/testsuite/gdb.base/hook-stop-continue.exp @@ -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"