| # Copyright 2016-2018 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 <http://www.gnu.org/licenses/>. | |
| # Make sure that if an inferior exits or is detached/killed, its | |
| # watchpoints don't end up with stale locations, preventing resumption | |
| # of other inferiors. | |
| standard_testfile | |
| if {[build_executable "failed to build" $testfile $srcfile {debug}]} { | |
| return -1 | |
| } | |
| # The test proper. DISPOSE indicates how to dispose of the fork | |
| # child. Can be either "kill", "detach", or "exit" (to continue it to | |
| # normal exit). | |
| proc do_test {dispose} { | |
| global binfile | |
| clean_restart $binfile | |
| gdb_test_no_output "set follow-fork child" | |
| gdb_test_no_output "set detach-on-fork off" | |
| if ![runto "child_function"] { | |
| fail "can't run to child_function" | |
| return | |
| } | |
| gdb_test "watch globalvar" "atchpoint \[0-9\]+: globalvar" \ | |
| "set watchpoint on inferior 2" | |
| # Dispose of the inferior. This should get rid of this inferior's | |
| # watchpoint locations. | |
| if {$dispose == "kill"} { | |
| gdb_test "kill" "" "kill inferior 2" \ | |
| "Kill the program being debugged.*y or n. $" "y" | |
| } elseif {$dispose == "detach"} { | |
| gdb_test "detach" ".*" "detach inferior 2" | |
| } elseif {$dispose == "exit"} { | |
| gdb_test "continue" ".*exited normally.*" "run to exit inferior 2" | |
| } else { | |
| perror "unhandled dispose: $dispose" | |
| } | |
| gdb_test "inferior 1" "witching to inferior 1 .*" \ | |
| "switch back to inferior 1" | |
| if {$dispose == "kill"} { | |
| gdb_test "print expect_signaled = 1" " = 1" | |
| } | |
| gdb_breakpoint "marker" | |
| # Now continue inferior 1. Before GDB was fixed, watchpoints for | |
| # inferior 2 managed to be left behind. When GDB realized that | |
| # they hadn't been inserted, the continue command was aborted: | |
| # | |
| # (gdb) continue | |
| # Continuing. | |
| # Warning: | |
| # Could not insert hardware watchpoint 2. | |
| # Could not insert hardware breakpoints: | |
| # You may have requested too many hardware breakpoints/watchpoints. | |
| # | |
| # Command aborted. | |
| # (gdb) | |
| # | |
| gdb_test "continue" "Breakpoint \[0-9\]+, marker .*" \ | |
| "continue in inferior 1" | |
| } | |
| foreach_with_prefix dispose {"kill" "detach" "exit"} { | |
| do_test $dispose | |
| } |