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"