1# Copyright 1999-2020 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# 17# Test essential Machine interface (MI) operations 18# 19# Verify that, using the MI, we can run a simple program and perform basic 20# debugging activities like: insert breakpoints, run the program, 21# step, next, continue until it ends and, last but not least, quit. 22# 23# The goal is not to test gdb functionality, which is done by other tests, 24# but to verify the correct output response to MI operations. 25# 26 27load_lib mi-support.exp 28set MIFLAGS "-i=mi" 29 30gdb_exit 31if [mi_gdb_start] { 32 continue 33} 34 35standard_testfile basics.c 36 37if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 38 untested "failed to compile" 39 return -1 40} 41 42mi_delete_breakpoints 43mi_gdb_reinitialize_dir $srcdir/$subdir 44mi_gdb_reinitialize_dir $srcdir/$subdir 45mi_gdb_load ${binfile} 46 47proc test_breakpoints_creation_and_listing {} { 48 global srcfile 49 50 set line_callee4_head [gdb_get_line_number "callee4 ("] 51 set line_callee4_body [expr $line_callee4_head + 2] 52 set line_callee3_head [gdb_get_line_number "callee3 ("] 53 set line_callee3_body [expr $line_callee3_head + 2] 54 set line_callee2_head [gdb_get_line_number "callee2 ("] 55 set line_callee2_body [expr $line_callee2_head + 2] 56 set line_main_head [gdb_get_line_number "main ("] 57 set line_main_body [expr $line_main_head + 2] 58 59 # Insert some breakpoints and list them 60 # Also, disable some so they do not interfere with other tests 61 # Tests: 62 # -break-insert 63 # -break-list 64 # -break-disable 65 # -break-info 66 67 set bps {} 68 lappend bps [mi_create_breakpoint "main" \ 69 "break-insert operation" \ 70 -number 1 -func main -file ".*basics.c" \ 71 -line $line_main_body] 72 73 lappend bps [mi_create_breakpoint "basics.c:callee2" \ 74 "insert breakpoint at basics.c:callee2" \ 75 -number 2 -func callee2 -file ".*basics.c" \ 76 -line $line_callee2_body] 77 78 lappend bps [mi_create_breakpoint "basics.c:$line_callee3_head" \ 79 "insert breakpoint at basics.c:\$line_callee3_head" \ 80 -number 3 -func callee3 -file ".*basics.c" \ 81 -line $line_callee3_body] 82 83 lappend bps [mi_create_breakpoint \ 84 "\"\\\"${srcfile}\\\":$line_callee4_head\"" \ 85 "insert breakpoint at \"<fullfilename>\":\$line_callee4_head" \ 86 -number 4 -func callee4 -file ".*basics.c" \ 87 -line $line_callee4_body] 88 89 mi_gdb_test "204-break-list" \ 90 "204\\^done,[mi_make_breakpoint_table $bps]" \ 91 "list of breakpoints" 92 93 mi_gdb_test "205-break-disable 2 3 4" \ 94 "205\\^done.*" \ 95 "disabling of breakpoints" 96 97 set bp2 [mi_make_breakpoint -number 2 -enabled n] 98 mi_gdb_test "206-break-info 2" \ 99 "206\\^done,[mi_make_breakpoint_table [list $bp2]]"\ 100 "list of breakpoints, 16 disabled" 101} 102 103proc test_running_the_program {} { 104 set line_main_head [gdb_get_line_number "main ("] 105 set line_main_body [expr $line_main_head + 2] 106 107 # Run the program without args, then specify srgs and rerun the program 108 # Tests: 109 # -exec-run 110 # -gdb-set 111 112 # mi_gdb_test cannot be used for asynchronous commands because there are 113 # two prompts involved and this can lead to a race condition. 114 # The following is equivalent to a send_gdb "000-exec-run\n" 115 mi_run_cmd 116 mi_expect_stop "breakpoint-hit" "main" "" ".*basics.c" "$line_main_body" \ 117 { "" "disp=\"keep\"" } "run to main" 118} 119 120proc test_controlled_execution {} { 121 global hex 122 123 set line_callee4_head [gdb_get_line_number "callee4 ("] 124 set line_callee4_body [expr $line_callee4_head + 2] 125 set line_callee3_head [gdb_get_line_number "callee3 ("] 126 set line_callee3_call [expr $line_callee3_head + 2] 127 set line_callee3_close_brace [expr $line_callee3_head + 3] 128 set line_callee1_head [gdb_get_line_number "callee1 ("] 129 set line_callee1_body [expr $line_callee1_head + 2] 130 set line_main_head [gdb_get_line_number "main ("] 131 set line_main_body [expr $line_main_head + 2] 132 133 # Continue execution until a breakpoint is reached, step into calls, verifying 134 # if the arguments are correctly shown, continue to the end of a called 135 # function, step over a call (next). 136 # Tests: 137 # -exec-continue 138 # -exec-next 139 # -exec-step 140 # -exec-finish 141 142 mi_next_to "main" "" "basics.c" [expr $line_main_body + 1] "next at main" 143 144 # FIXME: A string argument is not printed right; should be fixed and 145 # we should look for the right thing here. 146 # NOTE: The ``\\\\\"'' is for \". 147 mi_step_to "callee1" \ 148 "\{name=\"intarg\",value=\"2\"\},\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\},\{name=\"fltarg\",value=\"3.5\"\}" \ 149 "basics.c" "$line_callee1_body" "step at main" 150 151 # FIXME: A string argument is not printed right; should be fixed and 152 # we should look for the right thing here. 153 mi_execute_to "exec-step 3" "end-stepping-range" "callee4" "" \ 154 "basics.c" $line_callee4_body "" "step to callee4" 155 156 # FIXME: A string argument is not printed right; should be fixed and 157 # we should look for the right thing here. 158 # NOTE: The ``.'' is part of ``gdb-result-var="$1"'' 159 mi_finish_to "callee3" ".*" "basics.c" \ 160 "($line_callee3_call|$line_callee3_close_brace)" ".1" "0" "exec-finish" 161} 162 163proc test_controlling_breakpoints {} { 164 # Enable, delete, set ignore counts in breakpoints 165 # (disable was already tested above) 166 # Tests: 167 # -break-delete 168 # -break-enable 169 # -break-after 170 # -break-condition 171 172} 173 174proc test_program_termination {} { 175 # Run to completion: normal and forced 176 # Tests: 177 # -exec-abort 178 # (normal termination of inferior) 179 180 mi_execute_to "exec-continue" "exited-normally" "" "" "" "" "" "continue to end" 181} 182 183test_breakpoints_creation_and_listing 184test_running_the_program 185test_controlled_execution 186test_controlling_breakpoints 187test_program_termination 188 189mi_gdb_exit 190return 0 191