# Copyright 2014-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 . */ # Test that GDB isn't silent if it fails to remove a breakpoint from # the main program, independently of whether the program was loaded # with "file PROGRAM" or directly from the command line with "gdb # PROGRAM". standard_testfile if {[build_executable "failed to prepare" $testfile $srcfile debug]} { return -1 } # Run the test proper. INITIAL_LOAD determines whether the program is # initially loaded by the "file" command or by passing it to GDB on # the command line. proc test_remove_bp { initial_load } { with_test_prefix "$initial_load" { global srcdir subdir binfile global gdb_prompt hex global GDBFLAGS gdb_exit set saved_gdbflags $GDBFLAGS # See "used to behave differently" further below. if { $initial_load == "file" } { gdb_start gdb_file_cmd $binfile } else { global last_loaded_file # gdb_file_cmd sets this. This is what gdb_reload # implementations use as binary. set last_loaded_file $binfile set GDBFLAGS "$GDBFLAGS $binfile" gdb_start } gdb_reinitialize_dir $srcdir/$subdir gdb_reload set GDBFLAGS $saved_gdbflags if ![runto start] { fail "can't run to start" return } delete_breakpoints # So we can easily control when are breakpoints removed. gdb_test_no_output "set breakpoint always-inserted on" set bp_addr "" set test "break foo" gdb_test_multiple $test $test { -re "Breakpoint .* at ($hex).*$gdb_prompt $" { set bp_addr $expect_out(1,string) pass $test } } if {$bp_addr == ""} { unsupported "can't extract foo's address" return } gdb_test "info break" "y.*$hex.*in foo at.*" \ "breakpoint is set" # Now unmap the page where the breakpoint is set. Trying to # remove the memory breakpoint afterwards should fail, and GDB # should warn the user about it. set pagesize [get_integer_valueof "pg_size" 0] set align_addr [expr $bp_addr - $bp_addr % $pagesize] set munmap [get_integer_valueof "(int) munmap ($align_addr, $pagesize)" -1] if {$munmap != 0} { unsupported "can't munmap foo's page" return } gdb_test "delete \$bpnum" \ "warning: Error removing breakpoint .*" \ "failure to remove breakpoint warns" } } foreach initial_load { "cmdline" "file" } { test_remove_bp $initial_load }