📄 break.exp
字号:
# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997, 1998# 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 2 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, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Please email any bugs, comments, and/or additions to this file to:# bug-gdb@prep.ai.mit.edu# This file was written by Rob Savoye. (rob@cygnus.com)if $tracelevel then { strace $tracelevel}## test running programs#set prms_id 0set bug_id 0set testfile "break"set srcfile ${testfile}.cset binfile ${objdir}/${subdir}/${testfile}if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."}if [get_compiler_info ${binfile}] { return -1}gdb_exitgdb_startgdb_reinitialize_dir $srcdir/$subdirgdb_load ${binfile}if [target_info exists gdb_stub] { gdb_step_for_stub;}## test simple breakpoint setting commands## Test deleting all breakpoints when there are none installed,# GDB should not prompt for confirmation.# Note that gdb-init.exp provides a "delete_breakpoints" proc# for general use elsewhere.send_gdb "delete breakpoints\n"gdb_expect { -re "Delete all breakpoints.*$" { send_gdb "y\n" gdb_expect { -re "$gdb_prompt $" { fail "Delete all breakpoints when none (unexpected prompt)" } timeout { fail "Delete all breakpoints when none (timeout after unexpected prompt)" } } } -re ".*$gdb_prompt $" { pass "Delete all breakpoints when none" } timeout { fail "Delete all breakpoints when none (timeout)" }}## test break at function#gdb_test "break main" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint function"## test break at function in file#gdb_test "break $srcfile:factorial" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint function in file"## test break at line number## Note that the default source file is the last one whose source text# was printed. For native debugging, before we've executed the# program, this is the file containing main, but for remote debugging,# it's wherever the processor was stopped when we connected to the# board. So, to be sure, we do a list command.#gdb_test "list main" \ ".*main \\(argc, argv, envp\\).*" \ "use `list' to establish default source file"gdb_test "break 79" \ "Breakpoint.*at.* file .*$srcfile, line 79\\." \ "breakpoint line number"## test duplicate breakpoint#gdb_test "break 79" \ "Note: breakpoint \[0-9\]+ also set at pc.*Breakpoint \[0-9\]+ at.* file .*$srcfile, line 79\\." \ "breakpoint duplicate"## test break at line number in file#gdb_test "break $srcfile:85" \ "Breakpoint.*at.* file .*$srcfile, line 85\\." \ "breakpoint line number in file"## check to see what breakpoints are set#if [target_info exists gdb_stub] { set main_line 72} else { set main_line 75}if {$hp_aCC_compiler} { set proto "\\(int\\)"} else { set proto ""}gdb_test "info break" \ "Num Type\[ \]+Disp Enb Address\[ \]+What.*\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$main_line.*\[0-9\]+\[\t \]+breakpoint keep y.* in factorial$proto at .*$srcfile:96.*\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:79.*\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:79.*\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:85" \ "breakpoint info"# FIXME: The rest of this test doesn't work with anything that can't# handle arguments.# Huh? There doesn't *appear* to be anything that passes arguments# below.if [istarget "mips-idt-*"] then { return}## run until the breakpoint at main is hit. For non-stubs-using targets.#if ![target_info exists use_gdb_stub] { if [istarget "*-*-vxworks*"] then { send_gdb "run vxmain \"2\"\n" set timeout 120 verbose "Timeout is now $timeout seconds" 2 } else { send_gdb "run\n" } gdb_expect { -re "The program .* has been started already.*y or n. $" { send_gdb "y\n" exp_continue } -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:75.*75\[\t \]+if .argc.* \{.*$gdb_prompt $"\ { pass "run until function breakpoint" } -re ".*$gdb_prompt $" { fail "run until function breakpoint" } timeout { fail "run until function breakpoint (timeout)" } }} else { if ![target_info exists gdb_stub] { gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:75.*75\[\t \]+if .argc.*\{.*" "stub continue" }}## run until the breakpoint at a line number#gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:79.*79\[\t \]+printf.*factorial.*" \ "run until breakpoint set at a line number"## Run until the breakpoint set in a function in a file#for {set i 6} {$i >= 1} {incr i -1} { gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, factorial \\(value=$i\\) at .*$srcfile:96.*96\[\t \]+.*if .value > 1. \{.*" \ "run until file:function($i) breakpoint"}## run until the file:function breakpoint at a line number in a file#gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:85.*85\[\t \]+argc = \\(argc == 12345\\);.*" \ "run until file:linenum breakpoint"# Test break at offset +1gdb_test "break +1" \ "Breakpoint.*at.* file .*$srcfile, line 86\\." \ "breakpoint offset +1"# Check to see if breakpoint is hit when stepped ontogdb_test "step" \ ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:86.*86\[\t \]+return argc;" \ "step onto breakpoint"## delete all breakpoints so we can start over, course this can be a test too#delete_breakpoints## test temporary breakpoint at function#gdb_test "tbreak main" "Breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function"## test break at function in file#gdb_test "tbreak $srcfile:factorial" "Breakpoint.*at.* file .*$srcfile, line.*" \ "Temporary breakpoint function in file"## test break at line number#send_gdb "tbreak 79\n"gdb_expect { -re "Breakpoint.*at.* file .*$srcfile, line 79.*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } timeout { fail "breakpoint line number #1 (timeout)" }}gdb_test "tbreak 75" "Breakpoint.*at.* file .*$srcfile, line 75.*" "Temporary breakpoint line number #2"## test break at line number in file#send_gdb "tbreak $srcfile:85\n"gdb_expect { -re "Breakpoint.*at.* file .*$srcfile, line 85.*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } timeout { fail "Temporary breakpoint line number in file #1 (timeout)" }}gdb_test "tbreak $srcfile:81" "Breakpoint.*at.* file .*$srcfile, line 81.*" "Temporary breakpoint line number in file #2"## check to see what breakpoints are set (temporary this time)#gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$main_line.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in factorial$proto at .*$srcfile:96.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:79.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:75.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:85.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:81.*" \ "Temporary breakpoint info"#***********# Verify that catchpoints for fork, vfork and exec don't trigger# inappropriately. (There are no calls to those system functions# in this test program.)#if ![runto_main] then { fail "break tests suppressed" }send_gdb "catch\n"gdb_expect { -re "Catch requires an event name.*$gdb_prompt $"\ {pass "catch requires an event name"} -re "$gdb_prompt $"\ {fail "catch requires an event name"} timeout {fail "(timeout) catch requires an event name"}}set name "set catch fork, never expected to trigger"send_gdb "catch fork\n"gdb_expect { -re "Catchpoint \[0-9\]* .fork..*$gdb_prompt $" {pass $name} -re "Catch of fork not yet implemented.*$gdb_prompt $" {pass $name} -re "$gdb_prompt $" {fail $name} timeout {fail "(timeout) $name"}}set name "set catch vfork, never expected to trigger"send_gdb "catch vfork\n"# If we are on HP-UX 10.20, we expect an error message to be# printed if we type "catch vfork" at the gdb gdb_prompt. This is# because on HP-UX 10.20, we cannot catch vfork events.if [istarget "hppa*-hp-hpux10.20"] then { gdb_expect { -re "Catch of vfork events not supported on HP-UX 10.20..*$gdb_prompt $" {pass $name} -re "$gdb_prompt $" {fail $name} timeout {fail "(timeout) $name"} }} else { gdb_expect { -re "Catchpoint \[0-9\]* .vfork..*$gdb_prompt $" {pass $name} -re "Catch of vfork not yet implemented.*$gdb_prompt $" {pass $name} -re "$gdb_prompt $" {fail $name} timeout {fail "(timeout) $name"} }}set name "set catch exec, never expected to trigger"send_gdb "catch exec\n"gdb_expect { -re "Catchpoint \[0-9\]* .exec..*$gdb_prompt $" {pass $name} -re "Catch of exec not yet implemented.*$gdb_prompt $" {pass $name} -re "$gdb_prompt $" {fail $name} timeout {fail "(timeout) $name"}}# Verify that "until <location>" works. (This is really just syntactic# sugar for "tbreak <location>; continue".)#send_gdb "until 79\n"gdb_expect { -re "main .* at .*:79.*$gdb_prompt $"\ {pass "until 79"} -re "$gdb_prompt $"\ {fail "until 79"} timeout {fail "(timeout) until 79"}}# Verify that a malformed "until" is gracefully caught.#send_gdb "until 80 then stop\n"gdb_expect { -re "Junk at end of arguments..*$gdb_prompt $"\ {pass "malformed until"} -re "$gdb_prompt $"\ {fail "malformed until"} timeout {fail "(timeout) malformed until"}}# Verify that GDB responds gracefully when asked to set a breakpoint# on a nonexistent source line.#send_gdb "break 999\n"gdb_expect { -re "No line 999 in file .*$gdb_prompt $"\ {pass "break on non-existent source line"} -re "$gdb_prompt $"\ {fail "break on non-existent source line"} timeout {fail "(timeout) break on non-existent source line"}}# Verify that GDB allows one to just say "break", which is treated# as the "default" breakpoint. Note that GDB gets cute when printing# the informational message about other breakpoints at the same# location. We'll hit that bird with this stone too.#send_gdb "break\n"gdb_expect { -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\ {pass "break on default location, 1st time"} -re "$gdb_prompt $"\ {fail "break on default location, 1st time"} timeout {fail "(timeout) break on default location, 1st time"}}send_gdb "break\n"gdb_expect { -re "Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ {pass "break on default location, 2nd time"} -re "$gdb_prompt $"\ {fail "break on default location, 2nd time"} timeout {fail "(timeout) break on default location, 2nd time"}}send_gdb "break\n"gdb_expect { -re "Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ {pass "break on default location, 3rd time"} -re "$gdb_prompt $"\ {fail "break on default location, 3rd time"} timeout {fail "(timeout) break on default location, 3rd time"}}send_gdb "break\n"gdb_expect { -re "Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ {pass "break on default location, 4th time"} -re "$gdb_prompt $"\ {fail "break on default location, 4th time"} timeout {fail "(timeout) break on default location, 4th time"}}# Verify that a "silent" breakpoint can be set, and that GDB is indeed# "silent" about its triggering.#if ![runto_main] then { fail "break tests suppressed" }send_gdb "break 79\n"gdb_expect { -re "Breakpoint (\[0-9\]*) at .*, line 79.*$gdb_prompt $"\ {pass "set to-be-silent break 79"} -re "$gdb_prompt $"\ {fail "set to-be-silent break 79"} timeout {fail "(timeout) set to-be-silent break 79"}}send_gdb "commands $expect_out(1,string)\n"send_gdb "silent\n"send_gdb "end\n"gdb_expect { -re ".*$gdb_prompt $"\ {pass "set silent break 79"} timeout {fail "(timeout) set silent break 79"}}send_gdb "info break $expect_out(1,string)\n"gdb_expect { -re "\[0-9\]*\[ \t\]*breakpoint.*:79\r\n\[ \t\]*silent.*$gdb_prompt $"\ {pass "info silent break 79"} -re "$gdb_prompt $"\ {fail "info silent break 79"}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -