1
# Copyright (C) 2011-2012 Free Software Foundation, Inc.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 3 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
# This file is part of the GDB testsuite. It tests the mechanism
17
# exposing values to Python.
23
if {[skip_shlib_tests]} {
24
untested py-finish-breakpoint.exp
28
load_lib gdb-python.exp
30
set libfile "py-events-shlib"
31
set libsrc $srcdir/$subdir/$libfile.c
32
set lib_sl $objdir/$subdir/$libfile-nodebug.so
35
set testfile "py-finish-breakpoint"
36
set srcfile ${testfile}.c
37
set binfile ${objdir}/${subdir}/${testfile}
38
set exec_opts [list debug shlib=$lib_sl]
40
if [get_compiler_info ${binfile}] {
44
if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
45
|| [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} {
46
untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile."
50
# Start with a fresh gdb.
51
clean_restart ${testfile}
53
set python_file ${srcdir}/${subdir}/${testfile}.py
56
# Skip all tests if Python scripting is not enabled.
57
if { [skip_python_tests] } { continue }
60
# Test FinishBreakpoint in normal conditions
63
clean_restart ${testfile}
64
gdb_load_shlibs ${lib_sl}
66
if ![runto_main] then {
67
fail "Cannot run to main."
71
gdb_test_no_output "set confirm off" "disable confirmation"
72
gdb_test "source $python_file" "Python script imported.*" \
73
"import python scripts"
74
gdb_breakpoint "increase_1"
75
gdb_test "continue" "Breakpoint .*at.*" "continue to the function to finish"
77
# set FinishBreakpoint
79
gdb_test "python finishbp_default = gdb.FinishBreakpoint ()" \
80
"Temporary breakpoint.*" "set FinishBreakpoint with default frame value"
81
gdb_test "python finishbp = MyFinishBreakpoint (gdb.parse_and_eval ('a'), gdb.newest_frame ())" \
82
"Temporary breakpoint.*" "set FinishBreakpoint"
83
gdb_test "python print finishbp.return_value" "None.*" \
84
"check return_value at init"
88
gdb_test "continue" "MyFinishBreakpoint stop with.*return_value is: -5.*#0.*increase.*" \
89
"check MyFinishBreakpoint hit"
90
gdb_test "python print finishbp.return_value" "-5.*" "check return_value"
92
gdb_test "python print finishbp_default.hit_count" "1.*" "check finishBP on default frame has been hit"
93
gdb_test "python print finishbp.is_valid()" "False.*"\
94
"ensure that finish bp is invalid afer normal hit"
96
# check FinishBreakpoint in main no allowed
98
gdb_test "finish" "main.*" "return to main()"
99
gdb_test "python MyFinishBreakpoint (None, gdb.selected_frame ())" \
100
"ValueError: \"FinishBreakpoint\" not meaningful in the outermost frame..*" \
101
"check FinishBP not allowed in main"
104
# Test FinishBreakpoint with no debug symbol
107
clean_restart ${testfile}
108
gdb_load_shlibs ${lib_sl}
110
gdb_test "source $python_file" "Python script imported.*" \
111
"import python scripts"
112
set cond_line [gdb_get_line_number "Condition Break."]
114
if ![runto_main] then {
115
fail "Cannot run to main."
119
gdb_test "print do_nothing" "no debug info.*" "ensure that shared lib has no debug info"
120
gdb_breakpoint "do_nothing" {temporary}
121
gdb_test "continue" "Temporary breakpoint .*in \\.?do_nothing.*" \
122
"continue to do_nothing"
124
gdb_test "python finishBP = SimpleFinishBreakpoint(gdb.newest_frame())" \
125
"SimpleFinishBreakpoint init" \
126
"set finish breakpoint"
127
gdb_test "continue" "SimpleFinishBreakpoint stop.*" "check FinishBreakpoint hit"
128
gdb_test "python print finishBP.return_value" "None" "check return value without debug symbol"
131
# Test FinishBreakpoint in function returned by longjmp
134
clean_restart ${testfile}
135
gdb_load_shlibs ${lib_sl}
137
gdb_test "source $python_file" "Python script imported.*" \
138
"import python scripts"
140
if ![runto call_longjmp_1] then {
141
perror "couldn't run to breakpoint call_longjmp"
145
gdb_test "python finishbp = SimpleFinishBreakpoint(gdb.newest_frame())" \
146
"SimpleFinishBreakpoint init" \
147
"set finish breakpoint"
148
gdb_test "break [gdb_get_line_number "after longjmp."]" "Breakpoint.* at .*" \
149
"set BP after the jump"
150
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" \
151
"check FinishBP out of scope notification"
152
gdb_test "python print finishbp.is_valid()" "False.*"\
153
"ensure that finish bp is invalid afer out of scope notification"
156
# Test FinishBreakpoint in BP condition evaluation
157
# (finish in dummy frame)
160
clean_restart ${testfile}
161
gdb_load_shlibs ${lib_sl}
163
gdb_test "source $python_file" "Python script imported.*" \
164
"import python scripts"
167
if ![runto_main] then {
168
fail "Cannot run to main."
172
gdb_test "break ${cond_line} if test_1(i,8)" "Breakpoint .* at .*" \
173
"set a conditional BP"
174
gdb_test "python TestBreakpoint()" "TestBreakpoint init" \
175
"set FinishBP in a breakpoint condition"
176
gdb_test "continue" \
177
"\"FinishBreakpoint\" cannot be set on a dummy frame.*" \
178
"don't allow FinishBreakpoint on dummy frames"
179
gdb_test "print i" "8" "check stopped location"
182
# Test FinishBreakpoint in BP condition evaluation
183
# (finish in normal frame)
186
clean_restart ${testfile}
187
gdb_load_shlibs ${lib_sl}
189
gdb_test "source $python_file" "Python script imported.*" \
190
"import python scripts"
192
if ![runto_main] then {
193
fail "Cannot run to main."
197
gdb_test "break ${cond_line} if test(i,8)" \
198
"Breakpoint .* at .*" "set conditional BP"
199
gdb_test "python TestBreakpoint()" "TestBreakpoint init" "set BP in condition"
201
gdb_test "continue" \
202
"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.*" \
203
"stop in condition function"
205
gdb_test "continue" "Continuing.*" "finish condition evaluation"
206
gdb_test "continue" "Breakpoint.*" "stop at conditional breakpoint"
207
gdb_test "print i" "8" "check stopped location"
210
# Test FinishBreakpoint in explicit inferior function call
213
clean_restart ${testfile}
214
gdb_load_shlibs ${lib_sl}
216
gdb_test "source $python_file" "Python script imported.*" \
217
"import python scripts"
219
if ![runto_main] then {
220
fail "Cannot run to main."
224
# return address in dummy frame
226
gdb_test "python TestExplicitBreakpoint('increase_1')" "Breakpoint.*at.*" \
227
"prepare TestExplicitBreakpoint"
228
gdb_test "print increase_1(&i)" \
229
"\"FinishBreakpoint\" cannot be set on a dummy frame.*" \
230
"don't allow FinishBreakpoint on dummy frames"
232
# return address in normal frame
235
gdb_test "python TestExplicitBreakpoint(\"increase_1\")" "Breakpoint.*at.*" \
236
"prepare TestExplicitBreakpoint"
237
gdb_test "print increase(&i)" \
238
"SimpleFinishBreakpoint init.*SimpleFinishBreakpoint stop.*The program being debugged stopped while in a function called from GDB.*" \
239
"FinishBP stop at during explicit function call"
243
# Test FinishBreakpoint when inferior exits
246
if ![runto "test_exec_exit"] then {
247
fail "Cannot run to test_exec_exit."
251
gdb_test_no_output "set var self_exec = 0" "switch to exit() test"
252
gdb_test "python SimpleFinishBreakpoint(gdb.newest_frame())" "SimpleFinishBreakpoint init" "set FinishBP after the exit()"
253
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" "catch out of scope after exit"
256
# Test FinishBreakpoint when inferior execs
259
if ![runto "test_exec_exit"] then {
260
fail "Cannot run to test_exec_exit."
264
gdb_test "python SimpleFinishBreakpoint(gdb.newest_frame())" "SimpleFinishBreakpoint init" "set FinishBP after the exec"
265
gdb_test "catch exec" "Catchpoint.*\(exec\).*" "catch exec"
266
gdb_test "continue" "SimpleFinishBreakpoint out of scope.*" "catch out of scope after exec"