Home | History | Annotate | Line # | Download | only in gdb.multi
      1 # Copyright 2009-2024 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 # Test multi-exec / multi-process features that work for all configurations,
     17 # even ones that cannot run multiple processes simultaneously.
     18 
     19 set testfile "base"
     20 
     21 set exec1 "hello"
     22 set srcfile1 ${exec1}.c
     23 set binfile1 [standard_output_file ${exec1}]
     24 
     25 set exec2 "hangout"
     26 set srcfile2 ${exec2}.c
     27 set binfile2 [standard_output_file ${exec2}]
     28 
     29 set exec3 "goodbye"
     30 set srcfile3 ${exec3}.c
     31 set binfile3 [standard_output_file ${exec3}]
     32 
     33 if { [build_executable ${testfile}.exp ${exec1} "${srcfile1}" {debug}] == -1 } {
     34     return -1
     35 }
     36 
     37 if { [build_executable ${testfile}.exp ${exec2} "${srcfile2}" {debug}] == -1} {
     38     return -1
     39 }
     40 
     41 if { [build_executable ${testfile}.exp ${exec3} "${srcfile3}" {debug}] == -1 } {
     42     return -1
     43 }
     44 
     45 clean_restart ${exec1}
     46 
     47 gdb_test {print $_inferior} " = 1"
     48 
     49 # Add an empty inferior, switch to it, and load a main executable into
     50 # it.
     51 gdb_test "add-inferior" "Added inferior 2.*" "add empty inferior 2"
     52 gdb_test "inferior 2" "Switching to inferior 2.*" "switch to inferior 2"
     53 gdb_test "file ${binfile2}" ".*" "load ${exec2} file in inferior 2"
     54 
     55 gdb_test {print $_inferior} " = 2" "print \$_inferior after switching"
     56 
     57 # Add a new inferior and load a main executable into it in one
     58 # command.
     59 gdb_test "add-inferior -exec ${binfile3}" \
     60     "Added inferior 3.*" \
     61     "add inferior 3 with -exec ${exec3}"
     62 
     63 # Check that we have multiple inferiors.
     64 
     65 gdb_test "info inferiors" \
     66     "Executable.*${exec1}.*${exec2}.*${exec3}.*"
     67 
     68 # Test info inferiors with args
     69 
     70 set see1 0
     71 set see2 0
     72 set see3 0
     73 
     74 gdb_test_multiple "info inferior 2 3" "info inferior 2 3" {
     75     -re ". 1 \[^\r\n\]*${exec1}" {
     76 	set see1 1
     77 	exp_continue
     78     }
     79     -re ". 2 \[^\r\n\]*${exec2}" {
     80 	set see2 1
     81 	exp_continue
     82     }
     83     -re ". 3 \[^\r\n\]*${exec3}" {
     84 	set see3 1
     85 	exp_continue
     86     }
     87     -re "$gdb_prompt $" {
     88 	if {!$see1 && $see2 && $see3} {
     89 	    pass "info inferior 2 3"
     90 	} else {
     91 	    fail "info inferior 2 3"
     92 	}
     93     }
     94 }
     95 
     96 set see1 0
     97 set see2 0
     98 set see3 0
     99 
    100 gdb_test_multiple "info inferior 1-2" "info inferior 1-2" {
    101     -re ". 1 \[^\r\n\]*${exec1}" {
    102 	set see1 1
    103 	exp_continue
    104     }
    105     -re ". 2 \[^\r\n\]*${exec2}" {
    106 	set see2 1
    107 	exp_continue
    108     }
    109     -re ". 3 \[^\r\n\]*${exec3}" {
    110 	set see3 1
    111 	exp_continue
    112     }
    113     -re "$gdb_prompt $" {
    114 	if {$see1 && $see2 && !$see3} {
    115 	    pass "info inferior 1-2"
    116 	} else {
    117 	    fail "info inferior 1-2"
    118 	}
    119     }
    120 }
    121 
    122 # Test that we have multiple symbol tables.
    123 
    124 gdb_test "inferior 1" ".*" "switch to inferior 1"
    125 gdb_test "info functions commonfun" \
    126     "${srcfile1}.*" \
    127     "'info functions commonfun' in inferior 1"
    128 
    129 gdb_test "inferior 3" ".*" "switch to inferior 3"
    130 gdb_test "info functions commonfun" \
    131     "${srcfile3}.*" \
    132     "'info functions commonfun' in inferior 3"
    133 
    134 gdb_test "inferior 1" ".*" "switch back to inferior 1"
    135 
    136 gdb_test_no_output "set listsize 1"
    137 
    138 gdb_test "list commonfun" "from hello.*" "list commonfun in hello"
    139 
    140 gdb_test "print hglob" "1"
    141 
    142 gdb_test "print glob" "92" "print glob (${exec1})"
    143 
    144 
    145 gdb_test "inferior 3" ".*" "switch to inferior 3 to print globals"
    146 
    147 gdb_test "print gglob" "2"
    148 
    149 gdb_test "print glob" "45" "print glob (${exec3})"
    150 
    151 gdb_test "list commonfun" "from goodbye.*" "list commonfun in goodbye"
    152 
    153 
    154 # Let's run the hello program.
    155 gdb_test "inferior 1" ".*" "switch to inferior 1 to run it"
    156 
    157 if {![runto_main]} {
    158     return -1
    159 }
    160 
    161 gdb_test "break hello" ".*"
    162 gdb_test "continue" "Breakpoint \[0-9\].*, hello.*"
    163 
    164 # Now let's remove the other two
    165 
    166 gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3"
    167 
    168 set see1 0
    169 set see2 0
    170 set see3 0
    171 
    172 gdb_test_multiple "info inferiors" "check remove-inferiors" {
    173     -re ". 3 \[^\r\n\]*${exec3}" {
    174 	set see3 1
    175 	exp_continue
    176     }
    177     -re ". 2 \[^\r\n\]*${exec2}" {
    178 	set see2 1
    179 	exp_continue
    180     }
    181     -re ". 1 \[^\r\n\]*${exec1}" {
    182 	set see1 1
    183 	exp_continue
    184     }
    185     -re "$gdb_prompt $" {
    186 	if {$see1 && !$see2 && !$see3} {
    187 	    pass "check remove-inferiors"
    188 	} else {
    189 	    fail "check remove-inferiors"
    190 	}
    191     }
    192 }
    193 
    194