1# Copyright 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 2# Free Software Foundation, Inc. 3 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 3 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <http://www.gnu.org/licenses/>. 16 17# This file was created by Jeff Johnston. (jjohnstn@redhat.com) 18 19if $tracelevel then { 20 strace $tracelevel 21} 22 23# 24# test running programs 25# 26 27if {[skip_shlib_tests]} { 28 return 0 29} 30 31set testfile "pending" 32set libfile "pendshr" 33set srcfile $testfile.c 34set libsrc $srcdir/$subdir/$libfile.c 35set binfile $objdir/$subdir/$testfile 36set lib_sl $objdir/$subdir/$libfile.sl 37 38set lib_opts debug 39set exec_opts [list debug shlib=$lib_sl] 40 41if [get_compiler_info ${binfile}] { 42 return -1 43} 44 45if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" 46 || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { 47 untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." 48 return -1 49} 50 51# Start with a fresh gdb. 52 53gdb_exit 54gdb_start 55gdb_reinitialize_dir $srcdir/$subdir 56 57gdb_test_multiple "break pendfunc1" "set pending breakpoint" { 58 -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { 59 gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint (without symbols)" 60 } 61} 62 63gdb_test "info break" \ 64 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 65\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.*" \ 66"single pending breakpoint info (without symbols)" 67 68gdb_load ${binfile} 69gdb_load_shlibs $lib_sl 70 71set pendfunc1_loc [gdb_get_line_number "y = x + 4" ${libfile}.c] 72 73gdb_run_cmd 74 75gdb_test "" \ 76".*Breakpoint.*pendfunc1.*at.*pendshr.c:$pendfunc1_loc.*y = x \\+ 4.*" \ 77"run to resolved breakpoint 1 (without symbols)" 78 79# Restart with a fresh gdb. 80 81gdb_exit 82gdb_start 83gdb_reinitialize_dir $srcdir/$subdir 84 85gdb_load ${binfile} 86gdb_load_shlibs $lib_sl 87 88if [target_info exists gdb_stub] { 89 gdb_step_for_stub; 90} 91# 92# Test setting, querying, and modifying pending breakpoints 93# 94 95gdb_test_multiple "break pendfunc1" "set pending breakpoint" { 96 -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { 97 gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint" 98 } 99} 100 101gdb_test "info break" \ 102 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 103\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.*" \ 104"single pending breakpoint info" 105 106# 107# Test breaking at existing function 108# 109 110set mainline [gdb_get_line_number "break main here"] 111 112gdb_test "break main" \ 113 "Breakpoint.*at.* file .*$srcfile, line $mainline.*" \ 114 "breakpoint function" 115 116gdb_test "info break" \ 117 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 118\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.* 119\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline" \ 120"pending plus real breakpoint info" 121 122 123# 124# Test not setting a pending breakpoint 125# 126gdb_test "break pendfunc2" \ 127 "" \ 128 "Don't set pending breakpoint" \ 129 ".*Make breakpoint pending.*y or \\\[n\\\]. $" \ 130 "n" 131 132# 133# Add condition to pending breakpoint 134# 135 136gdb_test_no_output "condition 1 k == 1" 137 138gdb_test "info break" \ 139 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 140\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.* 141\[\t \]+stop only if k == 1.* 142\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline" \ 143"pending plus condition" 144 145# 146# Disable pending breakpoint 147# 148 149gdb_test_no_output "disable 1" 150 151gdb_test "info break" \ 152 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 153\[0-9\]+\[\t \]+breakpoint keep n.*PENDING.*pendfunc1.* 154\[\t \]+stop only if k == 1.* 155\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline" \ 156"pending disabled" 157 158# 159# Add commands to pending breakpoint 160# 161gdb_test "commands 1\nprint k\nend" "" \ 162 "Set commands for pending breakpoint" 163 164gdb_test "info break" \ 165 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 166\[0-9\]+\[\t \]+breakpoint keep n.*PENDING.*pendfunc1.* 167\[\t \]+stop only if k == 1.* 168\[\t \]+print k.* 169\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline" \ 170"pending disabled plus commands" 171 172# 173# Try a pending break for a line in a source file with a condition 174# 175 176set bp2_loc [gdb_get_line_number "y = x + 4" ${libfile}.c] 177gdb_test_multiple "break pendshr.c:$bp2_loc if x > 3" "Set pending breakpoint 2" { 178 -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { 179 gdb_test "y" "Breakpoint.*pendshr.c:$bp2_loc.*pending." \ 180 "Set pending breakpoint 2" 181 } 182} 183 184gdb_test "info break" \ 185 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 186\[0-9\]+\[\t \]+breakpoint keep n.*PENDING.*pendfunc1.* 187\[\t \]+stop only if k == 1.* 188\[\t \]+print k.* 189\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline.* 190\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendshr.c:$bp2_loc if x > 3.*" \ 191"multiple pending breakpoints" 192 193 194# 195# Try a pending break for a line in a source file with ignore count: 196# 197 198set bp3_loc [gdb_get_line_number "printf" ${libfile}.c] 199gdb_test_multiple "break pendshr.c:$bp3_loc" "Set pending breakpoint 3" { 200 -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { 201 gdb_test "y" "Breakpoint.*pendshr.c:$bp3_loc.*pending." \ 202 "Set pending breakpoint 3" 203 } 204} 205 206gdb_test {ignore $bpnum 2} "Will ignore next 2 crossings of breakpoint .*" \ 207 "set ignore count on pending breakpoint 3" 208 209gdb_test "info break" \ 210 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 211\[0-9\]+\[\t \]+breakpoint keep n.*PENDING.*pendfunc1.* 212\[\t \]+stop only if k == 1.* 213\[\t \]+print k.* 214\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline.* 215\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendshr.c:$bp2_loc if x > 3.* 216\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendshr.c:$bp3_loc.*ignore next 2 hits.*" \ 217"multiple pending breakpoints 2" 218 219# 220# Run to main which should resolve a pending breakpoint 221# 222 223gdb_run_cmd 224gdb_test "" \ 225".*Breakpoint.*, main.*$mainline.*" \ 226"running to main" 227 228# 229# Re-enable the first pending breakpoint which should resolve 230# 231 232gdb_test_no_output "enable 1" \ 233"re-enabling pending breakpoint that can resolve instantly" 234 235# 236# Continue to verify conditionals and commands for breakpoints are honored 237# 238 239gdb_test "continue" \ 240".*Breakpoint.*pendfunc1.*at.*pendshr.c:$bp2_loc.*4;" \ 241"continue to resolved breakpoint 2" 242 243gdb_test "continue" \ 244".*Breakpoint.*pendfunc1.*at.*pendshr.c:$bp2_loc.* 245\[$\]1 = 1." \ 246"continue to resolved breakpoint 1" 247 248# 249# Disable the other two breakpoints, and continue to the one with 250# the ignore count. Make sure you hit it the third time, x should 251# be 3 then. 252# 253 254gdb_test "disable 7" "" "Disable other breakpoints" 255gdb_test "disable 5" "" "Disable other breakpoints" 256 257gdb_test "continue" \ 258 ".*Breakpoint.*pendfunc1.*\\\(x=3\\\) at.*pendshr.c:$bp3_loc.*printf.*;" \ 259"continue to resolved breakpoint 3" 260 261delete_breakpoints 262 263gdb_breakpoint "main" 264 265# 266# Set non-existent pending breakpoint 267# 268gdb_test_multiple "break imaginary" "set imaginary pending breakpoint" { 269 -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { 270 gdb_test "y" "Breakpoint.*imaginary.*pending." \ 271 "set imaginary pending breakpoint" 272 } 273} 274 275# 276# rerun program and make sure that any pending breakpoint remains and no 277# error messages are issued for the missing function 278# 279 280rerun_to_main 281 282gdb_test "info break" \ 283 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 284\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$mainline.* 285\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*imaginary.*" \ 286"verify pending breakpoint after restart" 287