# Copyright (C) 1998, 2007, 2008, 2009, 2010 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 . if $tracelevel then { strace $tracelevel } # # test special commands # if { [skip_hp_tests] } then { continue } set testfile "run" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } { untested watch-cmd.exp return -1 } if [get_compiler_info ${binfile}] { return -1; } if { $gcc_compiled } then { continue } gdb_exit gdb_start delete_breakpoints gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} proc watchpoint_command_test {} { global gdb_prompt if [target_info exists noargs] { verbose "Skipping watchpoint_command_test because of noargs." return } if { ![runto factorial] } then { gdb_suppress_tests } # Don't depend upon argument passing, since most simulators don't currently # support it. Bash value variable to be what we want. gdb_test "p value=6" "" "set value to 6 in watchpoint_command_test" delete_breakpoints # Verify that we can create a watchpoint, and give it a commands # list that continues the inferior. We set the watchpoint on a # local variable, too, so that it self-deletes when the watched # data goes out of scope. # # What should happen is: Each time the watchpoint triggers, it # continues the inferior. Eventually, the watchpoint will self- # delete, when the watched variable is out of scope. But by that # time, the inferior should have exited. GDB shouldn't crash or # anything untoward as a result of this. # send_gdb "watch local_var\n" gdb_expect { -re ".*\[Ww\]atchpoint (\[0-9\]*): local_var.*$gdb_prompt $"\ { pass "watch local_var" set wp_id $expect_out(1,string) send_gdb "commands $wp_id\n" gdb_expect { -re "Type commands for when breakpoint $wp_id is hit, one per line.*>"\ { pass "begin commands on watch"} -re "$gdb_prompt $"\ {fail "begin commands on watch"} timeout {fail "(timeout) begin commands on watch"} } } -re "$gdb_prompt $"\ {fail "watch local_var"} timeout {fail "(timeout) watch local_var"} } # set wp_id $expect_out(1,string) # send_gdb "commands $wp_id\n" # gdb_expect { # -re "Type commands for when breakpoint $wp_id is hit, one per line.*>"\ # {pass "begin commands on watch"} # -re "$gdb_prompt $"\ # {fail "begin commands on watch"} # timeout {fail "(timeout) begin commands on watch"} # } send_gdb "print value\n" gdb_expect { -re ">"\ {pass "add print command to watch"} -re "$gdb_prompt $"\ {fail "add print command to watch"} timeout {fail "(timeout) add print command to watch"} } send_gdb "continue\n" gdb_expect { -re ">"\ {pass "add continue command to watch"} -re "$gdb_prompt $"\ {fail "add continue command to watch"} timeout {fail "(timeout) add continue command to watch"} } send_gdb "end\n" gdb_expect { -re "$gdb_prompt $"\ {pass "begin commands on watch"} timeout {fail "(timeout) begin commands on watch"} } send_gdb "continue\n" gdb_expect { -re "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*in main.*$gdb_prompt $"\ {pass "continue with watch"} -re "$gdb_prompt $"\ {fail "continue with watch"} timeout {fail "(timeout) continue with watch"} } send_gdb "continue\n" gdb_expect { -re "Continuing.*$gdb_prompt $"\ {pass "continue until exit"} -re "$gdb_prompt $"\ {fail "continue until exit"} timeout {fail "(timeout) continue until exit"} } } watchpoint_command_test