| # Copyright 2016-2021 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"] { |
| 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 |
| } |