forked from Imagelibrary/binutils-gdb
As follow-up to this discussion: https://sourceware.org/pipermail/gdb-patches/2020-August/171385.html ... make runto_main not pass no-message to runto. This means that if we fail to run to main, for some reason, we'll emit a FAIL. This is the behavior we want the majority of (if not all) the time. Without this, we rely on tests logging a failure if runto_main fails, otherwise. They do so in a very inconsisteny mannet, sometimes using "fail", "unsupported" or "untested". The messages also vary widly. This patch removes all these messages as well. Also, remove a few "fail" where we call runto (and not runto_main). by default (without an explicit no-message argument), runto prints a failure already. In two places, gdb.multi/multi-re-run.exp and gdb.python/py-pp-registration.exp, remove "message" passed to runto. This removes a few PASSes that we don't care about (but FAILs will still be printed if we fail to run to where we want to). This aligns their behavior with the rest of the testsuite. Change-Id: Ib763c98c5f4fb6898886b635210d7c34bd4b9023
254 lines
8.0 KiB
Plaintext
254 lines
8.0 KiB
Plaintext
# Copyright (C) 2011-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/>.
|
|
|
|
# This file is part of the GDB testsuite. It tests the mechanism
|
|
# exposing values to Python.
|
|
|
|
if {[skip_shlib_tests]} {
|
|
untested "skipping shared library tests"
|
|
return 0
|
|
}
|
|
|
|
load_lib gdb-python.exp
|
|
|
|
set libfile "py-events-shlib"
|
|
set libsrc $srcdir/$subdir/$libfile.c
|
|
set lib_sl [standard_output_file $libfile-nodebug.so]
|
|
set lib_opts ""
|
|
|
|
standard_testfile
|
|
set exec_opts [list debug shlib=$lib_sl]
|
|
|
|
if [get_compiler_info] {
|
|
return -1
|
|
}
|
|
|
|
if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
|
|
|| [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} {
|
|
untested "failed to compile"
|
|
return -1
|
|
}
|
|
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if { [skip_python_tests] } { continue }
|
|
|
|
#
|
|
# Test FinishBreakpoint in normal conditions
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
set python_file [gdb_remote_download host \
|
|
${srcdir}/${subdir}/${testfile}.py]
|
|
|
|
gdb_test_no_output "set confirm off" "disable confirmation"
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 1"
|
|
gdb_breakpoint "increase_1"
|
|
gdb_test "continue" "Breakpoint .*at.*" "continue to the function to finish"
|
|
|
|
# set FinishBreakpoint
|
|
|
|
gdb_test "python finishbp_default = gdb.FinishBreakpoint ()" \
|
|
"Temporary breakpoint.*" "set FinishBreakpoint with default frame value"
|
|
gdb_test "python finishbp = MyFinishBreakpoint (gdb.parse_and_eval ('a'), gdb.newest_frame ())" \
|
|
"Temporary breakpoint.*" "set FinishBreakpoint"
|
|
gdb_test "python print (finishbp.return_value)" "None.*" \
|
|
"check return_value at init"
|
|
|
|
# check normal bp hit
|
|
|
|
gdb_test "continue" "MyFinishBreakpoint stop with.*return_value is: -5.*#0.*increase.*" \
|
|
"check MyFinishBreakpoint hit"
|
|
gdb_test "python print (finishbp.return_value)" "-5.*" "check return_value"
|
|
|
|
gdb_test "python print (finishbp_default.hit_count)" "1.*" "check finishBP on default frame has been hit"
|
|
gdb_test "python print (finishbp.is_valid())" "False.*"\
|
|
"ensure that finish bp is invalid afer normal hit"
|
|
|
|
# check FinishBreakpoint in main no allowed
|
|
|
|
gdb_test "finish" "main.*" "return to main()"
|
|
gdb_test "python MyFinishBreakpoint (None, gdb.selected_frame ())" \
|
|
"ValueError: \"FinishBreakpoint\" not meaningful in the outermost frame..*" \
|
|
"check FinishBP not allowed in main"
|
|
|
|
#
|
|
# Test FinishBreakpoint with no debug symbol
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 2"
|
|
set cond_line [gdb_get_line_number "Condition Break."]
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
gdb_test "print do_nothing" "no debug info.*" "ensure that shared lib has no debug info"
|
|
gdb_breakpoint "do_nothing" {temporary}
|
|
gdb_test "continue" "Temporary breakpoint .*in \\.?do_nothing.*" \
|
|
"continue to do_nothing"
|
|
|
|
gdb_test "python finishBP = SimpleFinishBreakpoint(gdb.newest_frame())" \
|
|
"SimpleFinishBreakpoint init" \
|
|
"set finish breakpoint for no debug symbol test"
|
|
gdb_test "continue" "SimpleFinishBreakpoint stop.*" "check FinishBreakpoint hit"
|
|
gdb_test "python print (finishBP.return_value)" "None" "check return value without debug symbol"
|
|
|
|
#
|
|
# Test FinishBreakpoint in function returned by longjmp
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 3"
|
|
|
|
if ![runto call_longjmp_1] then {
|
|
return
|
|
}
|
|
|
|
gdb_test "python finishbp = SimpleFinishBreakpoint(gdb.newest_frame())" \
|
|
"SimpleFinishBreakpoint init" \
|
|
"set finish breakpoint for longjmp test"
|
|
gdb_test "break [gdb_get_line_number "after longjmp."]" "Breakpoint.* at .*" \
|
|
"set BP after the jump"
|
|
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" \
|
|
"check FinishBP out of scope notification"
|
|
gdb_test "python print (finishbp.is_valid())" "False.*"\
|
|
"ensure that finish bp is invalid afer out of scope notification"
|
|
|
|
#
|
|
# Test FinishBreakpoint in BP condition evaluation
|
|
# (finish in dummy frame)
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 4"
|
|
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
gdb_test "break ${cond_line} if test_1(i,8)" "Breakpoint .* at .*" \
|
|
"set a conditional BP"
|
|
gdb_test "python TestBreakpoint()" "TestBreakpoint init" \
|
|
"set FinishBP in a breakpoint condition"
|
|
gdb_test "continue" \
|
|
"\"FinishBreakpoint\" cannot be set on a dummy frame.*" \
|
|
"don't allow FinishBreakpoint on dummy frames"
|
|
gdb_test "print i" "8" \
|
|
"check stopped location for stop in dummy frame case"
|
|
|
|
#
|
|
# Test FinishBreakpoint in BP condition evaluation
|
|
# (finish in normal frame)
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 5"
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
gdb_test "break ${cond_line} if test(i,8)" \
|
|
"Breakpoint .* at .*" "set conditional BP"
|
|
gdb_test "python TestBreakpoint()" "TestBreakpoint init" "set BP in condition"
|
|
|
|
gdb_test "continue" \
|
|
"test don't stop: 1.*test don't stop: 2.*test stop.*Error in testing breakpoint condition.*The program being debugged stopped while in a function called from GDB.*" \
|
|
"stop in condition function"
|
|
|
|
gdb_test "continue" "Continuing.*" "finish condition evaluation"
|
|
gdb_test "continue" "Breakpoint.*" "stop at conditional breakpoint"
|
|
gdb_test "print i" "8" \
|
|
"check stopped location for stop in normal frame case"
|
|
|
|
#
|
|
# Test FinishBreakpoint in explicit inferior function call
|
|
#
|
|
|
|
clean_restart ${testfile}
|
|
gdb_load_shlib ${lib_sl}
|
|
|
|
gdb_test "source $python_file" "Python script imported.*" \
|
|
"import python scripts, 6"
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
# return address in dummy frame
|
|
|
|
gdb_test "python TestExplicitBreakpoint('increase_1')" "Breakpoint.*at.*" \
|
|
"prepare TestExplicitBreakpoint, return addr in dummy frame"
|
|
gdb_test "print increase_1(&i)" \
|
|
"\"FinishBreakpoint\" cannot be set on a dummy frame.*" \
|
|
"don't allow FinishBreakpoint on dummy frames, return address in dummy frame"
|
|
|
|
# return address in normal frame
|
|
|
|
delete_breakpoints
|
|
gdb_test "python TestExplicitBreakpoint(\"increase_1\")" "Breakpoint.*at.*" \
|
|
"prepare TestExplicitBreakpoint, return addr in normal frame"
|
|
gdb_test "print increase(&i)" \
|
|
"SimpleFinishBreakpoint init.*SimpleFinishBreakpoint stop.*The program being debugged stopped while in a function called from GDB.*" \
|
|
"FinishBP stop at during explicit function call"
|
|
|
|
|
|
#
|
|
# Test FinishBreakpoint when inferior exits
|
|
#
|
|
|
|
if ![runto "test_exec_exit"] then {
|
|
return 0
|
|
}
|
|
|
|
gdb_test_no_output "set var self_exec = 0" "switch to exit() test"
|
|
gdb_test "python SimpleFinishBreakpoint(gdb.newest_frame())" "SimpleFinishBreakpoint init" "set FinishBP after the exit()"
|
|
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" "catch out of scope after exit"
|
|
|
|
#
|
|
# Test FinishBreakpoint when inferior execs
|
|
#
|
|
|
|
if ![runto "test_exec_exit"] then {
|
|
return 0
|
|
}
|
|
|
|
gdb_test "python SimpleFinishBreakpoint(gdb.newest_frame())" "SimpleFinishBreakpoint init" "set FinishBP after the exec"
|
|
gdb_test "catch exec" "Catchpoint.*\(exec\).*"
|
|
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" "catch out of scope after exec"
|