~ubuntu-branches/debian/sid/gdb/sid

« back to all changes in this revision

Viewing changes to gdb/testsuite/gdb.python/py-finish-breakpoint.exp

  • Committer: Package Import Robot
  • Author(s): Hector Oron
  • Date: 2012-01-28 00:41:20 UTC
  • mfrom: (1.4.9) (5.1.6 experimental)
  • Revision ID: package-import@ubuntu.com-20120128004120-bar1h77ark622noi
Tags: 7.4really-1
* New upstream release:
  - Many Python scripting improvements
  - Better support for ambiguous linespecs
  - Masked watchpoints
  - Tracepoint support improvements
  - Support for Texas Instruments TMS320C6x (tic6x-*-*)
  - A Renesas RL78 simulator (rl78-*-elf)
  - Some minor Remote protocol extensions and GDB/MI changes
* Temporarily disable gdb-multiarch and gdb-dbg.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2011-2012 Free Software Foundation, Inc.
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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/>.
 
15
 
 
16
# This file is part of the GDB testsuite.  It tests the mechanism
 
17
# exposing values to Python.
 
18
 
 
19
if $tracelevel then {
 
20
    strace $tracelevel
 
21
}
 
22
 
 
23
if {[skip_shlib_tests]} {
 
24
        untested py-finish-breakpoint.exp
 
25
    return 0
 
26
}
 
27
 
 
28
load_lib gdb-python.exp
 
29
 
 
30
set libfile "py-events-shlib"
 
31
set libsrc  $srcdir/$subdir/$libfile.c
 
32
set lib_sl  $objdir/$subdir/$libfile-nodebug.so
 
33
set lib_opts ""
 
34
 
 
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]
 
39
 
 
40
if [get_compiler_info ${binfile}] {
 
41
    return -1
 
42
}
 
43
 
 
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."
 
47
    return -1
 
48
}
 
49
 
 
50
# Start with a fresh gdb.
 
51
clean_restart ${testfile}
 
52
 
 
53
set python_file ${srcdir}/${subdir}/${testfile}.py
 
54
 
 
55
 
 
56
# Skip all tests if Python scripting is not enabled.
 
57
if { [skip_python_tests] } { continue }
 
58
 
 
59
#
 
60
# Test FinishBreakpoint in normal conditions
 
61
#
 
62
 
 
63
clean_restart ${testfile}
 
64
gdb_load_shlibs ${lib_sl}
 
65
 
 
66
if ![runto_main] then {
 
67
    fail "Cannot run to main."
 
68
    return 0
 
69
}
 
70
 
 
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"
 
76
 
 
77
# set FinishBreakpoint
 
78
 
 
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"
 
85
 
 
86
# check normal bp hit
 
87
 
 
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"
 
91
 
 
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"
 
95
 
 
96
# check FinishBreakpoint in main no allowed
 
97
 
 
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"
 
102
 
 
103
#
 
104
# Test FinishBreakpoint with no debug symbol 
 
105
#
 
106
 
 
107
clean_restart ${testfile}
 
108
gdb_load_shlibs ${lib_sl}
 
109
 
 
110
gdb_test "source $python_file" "Python script imported.*" \
 
111
         "import python scripts"
 
112
set cond_line [gdb_get_line_number "Condition Break."]
 
113
 
 
114
if ![runto_main] then {
 
115
    fail "Cannot run to main."
 
116
    return 0
 
117
}
 
118
 
 
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"
 
123
 
 
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"
 
129
 
 
130
#
 
131
# Test FinishBreakpoint in function returned by longjmp 
 
132
#
 
133
 
 
134
clean_restart ${testfile}
 
135
gdb_load_shlibs ${lib_sl}
 
136
 
 
137
gdb_test "source $python_file" "Python script imported.*" \
 
138
         "import python scripts"
 
139
 
 
140
if ![runto call_longjmp_1] then {
 
141
    perror "couldn't run to breakpoint call_longjmp"
 
142
    continue
 
143
}
 
144
 
 
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"
 
154
 
 
155
#
 
156
# Test FinishBreakpoint in BP condition evaluation 
 
157
# (finish in dummy frame)
 
158
#
 
159
 
 
160
clean_restart ${testfile}
 
161
gdb_load_shlibs ${lib_sl}
 
162
 
 
163
gdb_test "source $python_file" "Python script imported.*" \
 
164
         "import python scripts"
 
165
 
 
166
 
 
167
if ![runto_main] then {
 
168
    fail "Cannot run to main."
 
169
    return 0
 
170
}
 
171
         
 
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"
 
180
 
 
181
#
 
182
# Test FinishBreakpoint in BP condition evaluation 
 
183
# (finish in normal frame)
 
184
#
 
185
 
 
186
clean_restart ${testfile}
 
187
gdb_load_shlibs ${lib_sl}
 
188
 
 
189
gdb_test "source $python_file" "Python script imported.*" \
 
190
         "import python scripts"
 
191
 
 
192
if ![runto_main] then {
 
193
    fail "Cannot run to main."
 
194
    return 0
 
195
}
 
196
 
 
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"
 
200
 
 
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"
 
204
 
 
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"
 
208
 
 
209
#
 
210
# Test FinishBreakpoint in explicit inferior function call
 
211
#
 
212
 
 
213
clean_restart ${testfile}
 
214
gdb_load_shlibs ${lib_sl}
 
215
 
 
216
gdb_test "source $python_file" "Python script imported.*" \
 
217
         "import python scripts"
 
218
 
 
219
if ![runto_main] then {
 
220
    fail "Cannot run to main."
 
221
    return 0
 
222
}
 
223
 
 
224
# return address in dummy frame
 
225
 
 
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"
 
231
 
 
232
# return address in normal frame
 
233
 
 
234
delete_breakpoints
 
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"
 
240
 
 
241
 
 
242
#
 
243
# Test FinishBreakpoint when inferior exits
 
244
#
 
245
 
 
246
if ![runto "test_exec_exit"] then {
 
247
    fail "Cannot run to test_exec_exit."
 
248
    return 0
 
249
}
 
250
 
 
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"
 
254
 
 
255
#
 
256
# Test FinishBreakpoint when inferior execs
 
257
#
 
258
 
 
259
if ![runto "test_exec_exit"] then {
 
260
    fail "Cannot run to test_exec_exit."
 
261
    return 0
 
262
}     
 
263
 
 
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"