# Copyright 2009-2024 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 . # Test multi-exec / multi-process features that work for all configurations, # even ones that cannot run multiple processes simultaneously. set testfile "base" set exec1 "hello" set srcfile1 ${exec1}.c set binfile1 [standard_output_file ${exec1}] set exec2 "hangout" set srcfile2 ${exec2}.c set binfile2 [standard_output_file ${exec2}] set exec3 "goodbye" set srcfile3 ${exec3}.c set binfile3 [standard_output_file ${exec3}] if { [build_executable ${testfile}.exp ${exec1} "${srcfile1}" {debug}] == -1 } { return -1 } if { [build_executable ${testfile}.exp ${exec2} "${srcfile2}" {debug}] == -1} { return -1 } if { [build_executable ${testfile}.exp ${exec3} "${srcfile3}" {debug}] == -1 } { return -1 } clean_restart ${exec1} gdb_test {print $_inferior} " = 1" # Add an empty inferior, switch to it, and load a main executable into # it. gdb_test "add-inferior" "Added inferior 2.*" "add empty inferior 2" gdb_test "inferior 2" "Switching to inferior 2.*" "switch to inferior 2" gdb_test "file ${binfile2}" ".*" "load ${exec2} file in inferior 2" gdb_test {print $_inferior} " = 2" "print \$_inferior after switching" # Add a new inferior and load a main executable into it in one # command. gdb_test "add-inferior -exec ${binfile3}" \ "Added inferior 3.*" \ "add inferior 3 with -exec ${exec3}" # Check that we have multiple inferiors. gdb_test "info inferiors" \ "Executable.*${exec1}.*${exec2}.*${exec3}.*" # Test info inferiors with args set see1 0 set see2 0 set see3 0 gdb_test_multiple "info inferior 2 3" "info inferior 2 3" { -re ". 1 \[^\r\n\]*${exec1}" { set see1 1 exp_continue } -re ". 2 \[^\r\n\]*${exec2}" { set see2 1 exp_continue } -re ". 3 \[^\r\n\]*${exec3}" { set see3 1 exp_continue } -re "$gdb_prompt $" { if {!$see1 && $see2 && $see3} { pass "info inferior 2 3" } else { fail "info inferior 2 3" } } } set see1 0 set see2 0 set see3 0 gdb_test_multiple "info inferior 1-2" "info inferior 1-2" { -re ". 1 \[^\r\n\]*${exec1}" { set see1 1 exp_continue } -re ". 2 \[^\r\n\]*${exec2}" { set see2 1 exp_continue } -re ". 3 \[^\r\n\]*${exec3}" { set see3 1 exp_continue } -re "$gdb_prompt $" { if {$see1 && $see2 && !$see3} { pass "info inferior 1-2" } else { fail "info inferior 1-2" } } } # Test that we have multiple symbol tables. gdb_test "inferior 1" ".*" "switch to inferior 1" gdb_test "info functions commonfun" \ "${srcfile1}.*" \ "'info functions commonfun' in inferior 1" gdb_test "inferior 3" ".*" "switch to inferior 3" gdb_test "info functions commonfun" \ "${srcfile3}.*" \ "'info functions commonfun' in inferior 3" gdb_test "inferior 1" ".*" "switch back to inferior 1" gdb_test_no_output "set listsize 1" gdb_test "list commonfun" "from hello.*" "list commonfun in hello" gdb_test "print hglob" "1" gdb_test "print glob" "92" "print glob, ${exec1}" gdb_test "inferior 3" ".*" "switch to inferior 3 to print globals" gdb_test "print gglob" "2" gdb_test "print glob" "45" "print glob, ${exec3}" gdb_test "list commonfun" "from goodbye.*" "list commonfun in goodbye" # Let's run the hello program. gdb_test "inferior 1" ".*" "switch to inferior 1 to run it" if {![runto_main]} { return -1 } gdb_test "break hello" ".*" gdb_test "continue" "Breakpoint \[0-9\].*, hello.*" # Now let's remove the other two gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3" set see1 0 set see2 0 set see3 0 gdb_test_multiple "info inferiors" "check remove-inferiors" { -re ". 3 \[^\r\n\]*${exec3}" { set see3 1 exp_continue } -re ". 2 \[^\r\n\]*${exec2}" { set see2 1 exp_continue } -re ". 1 \[^\r\n\]*${exec1}" { set see1 1 exp_continue } -re "$gdb_prompt $" { if {$see1 && !$see2 && !$see3} { pass "check remove-inferiors" } else { fail "check remove-inferiors" } } }