]> Git Repo - binutils.git/blame - gdb/testsuite/gdb.python/py-breakpoint.exp
Automatic date update in version.in
[binutils.git] / gdb / testsuite / gdb.python / py-breakpoint.exp
CommitLineData
4a94e368 1# Copyright (C) 2010-2022 Free Software Foundation, Inc.
adc36818
PM
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
330a7fce 17# exposing breakpoints to Python.
adc36818 18
f760c4f2
CL
19# The skip_hw_watchpoint_tests checks if watchpoints are supported by the
20# processor. On PowerPC, the check runs a small test program under gdb
21# to determine if the Power processor supports HW watchpoints. The check
22# must be done before starting the test so as to not disrupt the execution
23# of the actual test.
24
25set skip_hw_watchpoint_tests_p [skip_hw_watchpoint_tests]
26
a2c09bd0
DE
27load_lib gdb-python.exp
28
b4a58790
TT
29standard_testfile
30
b89641ba
SM
31set options {debug c++}
32
33if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} ${options}] } {
adc36818
PM
34 return -1
35}
36
adc36818
PM
37# Skip all tests if Python scripting is not enabled.
38if { [skip_python_tests] } { continue }
39
fe68b953 40proc_with_prefix test_bkpt_basic { } {
330a7fce
DE
41 global srcfile testfile hex decimal
42
fe68b953
SM
43 # Start with a fresh gdb.
44 clean_restart ${testfile}
1957f6b8 45
fe68b953
SM
46 # We should start with no breakpoints.
47 gdb_test "python print (gdb.breakpoints())" "\\(\\)"
330a7fce 48
b0e16ca5 49 if {![runto_main]} {
fe68b953 50 return 0
330a7fce 51 }
fe68b953
SM
52
53 # Now there should be one breakpoint: main.
54 gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
55 "Get Breakpoint List" 0
56 gdb_test "python print (blist\[0\])" \
57 "<gdb.Breakpoint object at $hex>" "Check obj exists @main"
58 gdb_test "python print (blist\[0\].location)" \
59 "main." "Check breakpoint location @main"
60 gdb_test "python print (blist\[0\].pending)" "False" \
61 "Check pending status of main breakpoint"
62
63 set mult_line [gdb_get_line_number "Break at multiply."]
64 gdb_breakpoint ${mult_line}
65 gdb_continue_to_breakpoint "Break at multiply" \
66 ".*Break at multiply.*"
67
68 # Check that the Python breakpoint code noted the addition of a
69 # breakpoint "behind the scenes".
70 gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
71 "Get Breakpoint List" 0
72 gdb_test "python print (len(blist))" \
73 "2" "Check for two breakpoints"
74 gdb_test "python print (blist\[0\])" \
75 "<gdb.Breakpoint object at $hex>" "Check obj exists @main 2"
76 gdb_test "python print (blist\[0\].location)" \
77 "main." "Check breakpoint location @main 2"
78 gdb_test "python print (blist\[1\])" \
79 "<gdb.Breakpoint object at $hex>" "Check obj exists @mult_line"
80
81 gdb_test "python print (blist\[1\].location)" \
82 "py-breakpoint\.c:${mult_line}*" \
83 "check breakpoint location @mult_line"
84
85 # Check hit and ignore counts.
86 gdb_test "python print (blist\[1\].hit_count)" \
87 "1" "Check breakpoint hit count @1"
88 gdb_py_test_silent_cmd "python blist\[1\].ignore_count = 4" \
89 "Set breakpoint hit count" 0
90 gdb_continue_to_breakpoint "Break at multiply @6" \
91 ".*Break at multiply.*"
92 gdb_test "python print (blist\[1\].hit_count)" \
93 "6" "Check breakpoint hit count @6"
94 gdb_test "print result" \
95 " = 545" "Check expected variable result after 6 iterations"
96
97 # Test breakpoint is enabled and disabled correctly..
98 gdb_breakpoint [gdb_get_line_number "Break at add."]
99 gdb_continue_to_breakpoint "Break at add 1" ".*Break at add.*"
100 gdb_test "python print (blist\[1\].enabled)" \
101 "True" "Check breakpoint enabled."
102 gdb_py_test_silent_cmd "python blist\[1\].enabled = False" \
103 "Set breakpoint disabled." 0
104 gdb_continue_to_breakpoint "Break at add 2" ".*Break at add.*"
105 gdb_py_test_silent_cmd "python blist\[1\].enabled = True" \
106 "Set breakpoint enabled." 0
107 gdb_continue_to_breakpoint "Break at multiply after re-enable" \
108 ".*Break at multiply.*"
109
110 # Test other getters and setters.
111 gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
112 "Get Breakpoint List" 0
113 gdb_test "python print (blist\[1\].thread)" \
114 "None" "Check breakpoint thread"
115 gdb_test "python print (blist\[1\].type == gdb.BP_BREAKPOINT)" \
116 "True" "Check breakpoint type"
117 gdb_test "python print (blist\[0\].number)" \
118 "1" "Check breakpoint number 0"
119 gdb_test "python print (blist\[1\].number)" \
120 "2" "Check breakpoint number 1"
121 gdb_test "python print (blist\[2\].number)" \
122 "3" "Check breakpoint number 2"
adc36818
PM
123}
124
fe68b953 125proc_with_prefix test_bkpt_deletion { } {
330a7fce
DE
126 global srcfile testfile hex decimal
127
fe68b953
SM
128 # Start with a fresh gdb.
129 clean_restart ${testfile}
330a7fce 130
b0e16ca5 131 if {![runto_main]} {
fe68b953 132 return 0
330a7fce 133 }
fe68b953
SM
134
135 # Test breakpoints are deleted correctly.
136 set deltst_location [gdb_get_line_number "Break at multiply."]
137 set end_location [gdb_get_line_number "Break at end."]
138 gdb_py_test_silent_cmd "python dp1 = gdb.Breakpoint (\"$deltst_location\")" \
139 "Set breakpoint" 0
140 gdb_breakpoint [gdb_get_line_number "Break at end."]
141 gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" \
142 "Get Breakpoint List" 0
143 gdb_test "python print (len(del_list))" \
144 "3" "Number of breakpoints before delete"
145 gdb_continue_to_breakpoint "Break at multiply." \
146 ".*$srcfile:$deltst_location.*"
147 gdb_py_test_silent_cmd "python dp1.delete()" \
148 "Delete Breakpoint" 0
149 gdb_test "python print (dp1.number)" \
150 "RuntimeError: Breakpoint 2 is invalid.*" \
151 "Check breakpoint invalidated"
152 gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" \
153 "Get Breakpoint List" 0
154 gdb_test "python print (len(del_list))" \
155 "2" "Number of breakpoints after delete"
156 gdb_continue_to_breakpoint "Break at end." \
157 ".*$srcfile:$end_location.*"
94b6973e
PM
158}
159
fe68b953 160proc_with_prefix test_bkpt_cond_and_cmds { } {
330a7fce
DE
161 global srcfile testfile hex decimal
162
fe68b953
SM
163 # Start with a fresh gdb.
164 clean_restart ${testfile}
330a7fce 165
b0e16ca5 166 if {![runto_main]} {
fe68b953 167 return 0
330a7fce 168 }
fe68b953
SM
169
170 # Test conditional setting.
171 set bp_location1 [gdb_get_line_number "Break at multiply."]
172 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"$bp_location1\")" \
173 "Set breakpoint" 0
174 gdb_continue_to_breakpoint "Break at multiply" \
175 ".*Break at multiply.*"
176 gdb_py_test_silent_cmd "python bp1.condition = \"i == 5\"" \
177 "Set breakpoint" 0
178 gdb_test "python print (bp1.condition)" "i == 5" \
179 "Test conditional has been set"
180 gdb_continue_to_breakpoint "Break at multiply @5" \
181 ".*Break at multiply.*"
182 gdb_test "print i" \
183 "5" "Test conditional breakpoint stopped after five iterations"
184 gdb_py_test_silent_cmd "python bp1.condition = None" \
185 "Clear condition" 0
186 gdb_test "python print (bp1.condition)" \
187 "None" "Test conditional read"
188 gdb_continue_to_breakpoint "Break at multiply @6" \
189 ".*Break at multiply.*"
190 gdb_test "print i" \
191 "6" "Test breakpoint stopped after six iterations"
192
193 # Test commands.
194 gdb_breakpoint [gdb_get_line_number "Break at add."]
195 set test {commands $bpnum}
196 gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
197 set test {print "Command for breakpoint has been executed."}
198 gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
199 set test {print result}
200 gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
201 gdb_test "end"
202
203 gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
204 "Get Breakpoint List" 0
a913fffb
TT
205 gdb_py_test_silent_cmd "python last_bp = blist\[len(blist)-1\]" \
206 "Find last breakpoint" 0
207 gdb_test "python print (last_bp.commands)" \
fe68b953 208 "print \"Command for breakpoint has been executed.\".*print result"
a913fffb
TT
209
210 gdb_test_no_output "python last_bp.commands = 'echo hi\\necho there'" \
211 "set commands"
212 # Note the length is 3 because the string ends in a \n.
213 gdb_test "python print (len(last_bp.commands.split('\\n')))" "3" \
214 "check number of lines in commands"
adc36818
PM
215}
216
fe68b953 217proc_with_prefix test_bkpt_invisible { } {
330a7fce
DE
218 global srcfile testfile hex decimal
219
fe68b953
SM
220 # Start with a fresh gdb.
221 clean_restart ${testfile}
330a7fce 222
b0e16ca5 223 if {![runto_main]} {
fe68b953 224 return 0
330a7fce 225 }
fe68b953
SM
226
227 delete_breakpoints
228 set ibp_location [gdb_get_line_number "Break at multiply."]
229 gdb_py_test_silent_cmd "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=False)" \
230 "Set invisible breakpoint" 0
231 gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" \
232 "Get Breakpoint List" 0
233 gdb_test "python print (ilist\[0\])" \
234 "<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists 1"
235 gdb_test "python print (ilist\[0\].location)" \
236 "py-breakpoint\.c:$ibp_location*" "Check breakpoint location 1"
237 gdb_test "python print (ilist\[0\].visible)" \
238 "True" "Check breakpoint visibility 1"
239 gdb_test "info breakpoints" "py-breakpoint\.c:$ibp_location.*" \
240 "Check info breakpoints shows visible breakpoints"
241 delete_breakpoints
242 gdb_py_test_silent_cmd "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=True)" \
243 "Set invisible breakpoint" 0
244 gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" \
245 "Get Breakpoint List" 0
246 gdb_test "python print (ilist\[0\])" \
247 "<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists 2"
248 gdb_test "python print (ilist\[0\].location)" \
249 "py-breakpoint\.c:$ibp_location*" "Check breakpoint location 2"
250 gdb_test "python print (ilist\[0\].visible)" \
251 "False" "Check breakpoint visibility 2"
252 gdb_test "info breakpoints" "No breakpoints or watchpoints.*" \
253 "Check info breakpoints does not show invisible breakpoints"
254 gdb_test "maint info breakpoints" \
255 "py-breakpoint\.c:$ibp_location.*" \
256 "Check maint info breakpoints shows invisible breakpoints"
84f4c1fe
PM
257}
258
325d39e4
HD
259proc_with_prefix test_hardware_breakpoints { } {
260 global srcfile testfile hex decimal
261
27df6902
CL
262 # Skip these tests if the HW does not support hardware breakpoints.
263 if { [skip_hw_breakpoint_tests] } { return 0 }
264
325d39e4
HD
265 # Start with a fresh gdb.
266 clean_restart ${testfile}
267
b0e16ca5 268 if {![runto_main]} {
325d39e4
HD
269 return 0
270 }
271
272 delete_breakpoints
273
274 gdb_test "python hbp1 = gdb.Breakpoint(\"add\", type=gdb.BP_HARDWARE_BREAKPOINT)" \
275 ".*Hardware assisted breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\." \
276 "Set hardware breakpoint"
277 gdb_test "python print (gdb.breakpoints()\[0\].type == gdb.BP_HARDWARE_BREAKPOINT)" \
278 "True" "Check hardware breakpoint type"
279 gdb_test "continue" \
280 ".*Breakpoint ($decimal)+, add.*" \
281 "Test hardware breakpoint stop"
282}
283
fe68b953 284proc_with_prefix test_watchpoints { } {
330a7fce 285 global srcfile testfile hex decimal
f760c4f2 286 global skip_hw_watchpoint_tests_p
adc36818 287
fe68b953
SM
288 # Start with a fresh gdb.
289 clean_restart ${testfile}
adc36818 290
fe68b953 291 # Disable hardware watchpoints if necessary.
f760c4f2 292 if {$skip_hw_watchpoint_tests_p} {
fe68b953
SM
293 gdb_test_no_output "set can-use-hw-watchpoints 0" ""
294 }
adc36818 295
b0e16ca5 296 if {![runto_main]} {
fe68b953 297 return 0
330a7fce 298 }
fe68b953
SM
299
300 gdb_py_test_silent_cmd "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE )" \
301 "Set watchpoint" 0
302 gdb_test "python print (wp1.pending)" "False"
303 gdb_test "continue" \
304 ".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*main.*" \
305 "Test watchpoint write"
182b9acc 306}
7371cf6d 307
fe68b953 308proc_with_prefix test_bkpt_internal { } {
330a7fce 309 global srcfile testfile hex decimal
a16c9698 310 global skip_hw_watchpoint_tests_p
330a7fce 311
fe68b953
SM
312 # Start with a fresh gdb.
313 clean_restart ${testfile}
330a7fce 314
fe68b953 315 # Disable hardware watchpoints if necessary.
f760c4f2 316 if {$skip_hw_watchpoint_tests_p} {
fe68b953
SM
317 gdb_test_no_output "set can-use-hw-watchpoints 0" ""
318 }
b0e16ca5 319 if {![runto_main]} {
fe68b953 320 return 0
330a7fce 321 }
ea892bdc
EL
322 delete_breakpoints
323 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"main\", type=gdb.BP_BREAKPOINT, wp_class=gdb.WP_WRITE, internal=True )" \
324 "Set internal breakpoint" 0
325
326 set bp_num [get_python_valueof bp1.number "*DEFAULT*"]
327 set bp_addr [gdb_get_bp_addr $bp_num]
328
329 gdb_test "maint info break $bp_num" \
330 "$bp_num.*$bp_addr.*" \
331 "maint info breakpoint \$bp_num"
332
333 gdb_test "python gdb.execute(\'clear *$bp_addr\')" \
334 ".*No breakpoint at \\*$bp_addr.*" \
335 "clear internal breakpoint"
336
337 # Check again, make sure that GDB really didn't delete the internal breakpoint.
338 gdb_test "maint info break $bp_num" \
339 "$bp_num.*$bp_addr.*" \
340 "maint info breakpoint \$bp_num after clear"
341
fe68b953
SM
342 delete_breakpoints
343 gdb_py_test_silent_cmd "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE, internal=True )" \
344 "Set watchpoint" 0
345 gdb_test "info breakpoints" \
346 "No breakpoints or watchpoints.*" \
347 "Check info breakpoints does not show invisible breakpoints"
348 gdb_test "maint info breakpoints" \
349 ".*watchpoint.*result.*" \
350 "Check maint info breakpoints shows invisible breakpoints"
351 gdb_test "continue" \
352 ".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*" \
353 "Test watchpoint write"
182b9acc 354}
330a7fce 355
fe68b953 356proc_with_prefix test_bkpt_eval_funcs { } {
330a7fce 357 global srcfile testfile hex decimal
a16c9698 358 global skip_hw_watchpoint_tests_p
330a7fce 359
fe68b953
SM
360 # Start with a fresh gdb.
361 clean_restart ${testfile}
330a7fce 362
fe68b953 363 # Disable hardware watchpoints if necessary.
f760c4f2 364 if {$skip_hw_watchpoint_tests_p} {
fe68b953 365 gdb_test_no_output "set can-use-hw-watchpoints 0" ""
330a7fce 366 }
b0e16ca5 367 if {![runto_main]} {
fe68b953
SM
368 return 0
369 }
370 delete_breakpoints
371
2a17c803 372 gdb_test_multiline "Sub-class a breakpoint" \
fe68b953
SM
373 "python" "" \
374 "class bp_eval (gdb.Breakpoint):" "" \
375 " inf_i = 0" "" \
376 " count = 0" "" \
377 " def stop (self):" "" \
378 " self.count = self.count + 1" "" \
379 " self.inf_i = gdb.parse_and_eval(\"i\")" "" \
380 " if self.inf_i == 3:" "" \
381 " return True" "" \
382 " return False" "" \
383 "end" ""
384
2a17c803 385 gdb_test_multiline "Sub-class a second breakpoint" \
fe68b953
SM
386 "python" "" \
387 "class bp_also_eval (gdb.Breakpoint):" "" \
388 " count = 0" "" \
389 " def stop (self):" "" \
390 " self.count = self.count + 1" "" \
391 " if self.count == 9:" "" \
392 " return True" "" \
393 " return False" "" \
394 "end" ""
395
2a17c803 396 gdb_test_multiline "Sub-class a third breakpoint" \
fe68b953
SM
397 "python" "" \
398 "class basic (gdb.Breakpoint):" "" \
399 " count = 0" "" \
400 "end" ""
401
402 set bp_location2 [gdb_get_line_number "Break at multiply."]
403 set end_location [gdb_get_line_number "Break at end."]
404 gdb_py_test_silent_cmd "python eval_bp1 = bp_eval(\"$bp_location2\")" \
405 "Set breakpoint" 0
406 gdb_py_test_silent_cmd "python also_eval_bp1 = bp_also_eval(\"$bp_location2\")" \
407 "Set breakpoint" 0
408 gdb_py_test_silent_cmd "python never_eval_bp1 = bp_also_eval(\"$end_location\")" \
409 "Set breakpoint" 0
410 gdb_continue_to_breakpoint "Break at multiply, i==3" \
411 ".*$srcfile:$bp_location2.*"
412 gdb_test "print i" \
413 "3" "Check inferior value matches python accounting"
414 gdb_test "python print (eval_bp1.inf_i)" \
415 "3" "Check python accounting matches inferior"
416 gdb_test "python print (also_eval_bp1.count)" "4" \
417 "Check non firing same-location also_eval_bp1 function was also called at each stop."
418 gdb_test "python print (eval_bp1.count)" "4" \
419 "Check non firing same-location eval_bp1 function was also called at each stop."
420
421 delete_breakpoints
422 set cond_bp [gdb_get_line_number "Break at multiply."]
423 gdb_py_test_silent_cmd "python eval_bp1 = bp_eval(\"$cond_bp\")" \
424 "Set breakpoint" 0
425 set test_cond {cond $bpnum}
426 gdb_test "$test_cond \"foo==3\"" \
427 "Only one stop condition allowed. There is currently a Python.*" \
428 "Check you cannot add a CLI condition to a Python breakpoint that has defined stop"
429 gdb_py_test_silent_cmd "python eval_bp2 = basic(\"$cond_bp\")" \
430 "Set breakpoint" 0
431 gdb_py_test_silent_cmd "python eval_bp2.condition = \"1==1\"" \
432 "Set a condition" 0
2a17c803 433 gdb_test_multiline "Construct an eval function" \
fe68b953
SM
434 "python" "" \
435 "def stop_func ():" "" \
436 " return True" "" \
437 "end" ""
438
439 gdb_test "python eval_bp2.stop = stop_func" \
440 "RuntimeError: Only one stop condition allowed. There is currently a GDB.*" \
441 "assign stop function to a breakpoint that has a condition"
442
443 delete_breakpoints
444 gdb_breakpoint [gdb_get_line_number "Break at multiply."]
445 gdb_py_test_silent_cmd "python check_eval = bp_eval(\"$bp_location2\")" \
446 "Set breakpoint" 0
447 gdb_test "python print (check_eval.count)" "0" \
448 "Test that evaluate function has not been yet executed (ie count = 0)"
449 gdb_continue_to_breakpoint "Break at multiply, count==1" \
450 ".*$srcfile:$bp_location2.*"
451 gdb_test "python print (check_eval.count)" "1" \
452 "Test that evaluate function is run when location also has normal bp"
453
2a17c803 454 gdb_test_multiline "Sub-class a watchpoint" \
fe68b953
SM
455 "python" "" \
456 "class wp_eval (gdb.Breakpoint):" "" \
457 " def stop (self):" "" \
458 " self.result = gdb.parse_and_eval(\"result\")" "" \
459 " if self.result == 788:" "" \
460 " return True" "" \
461 " return False" "" \
462 "end" ""
463
464 delete_breakpoints
465 gdb_py_test_silent_cmd "python wp1 = wp_eval (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE)" \
466 "Set watchpoint" 0
467 gdb_test "continue" \
468 ".*\[Ww\]atchpoint.*result.*Old value =.*New value = 788.*" \
469 "Test watchpoint write"
470 gdb_test "python print (never_eval_bp1.count)" "0" \
471 "Check that this unrelated breakpoints eval function was never called."
7371cf6d 472}
330a7fce 473
fe68b953 474proc_with_prefix test_bkpt_temporary { } {
330a7fce
DE
475 global srcfile testfile hex decimal
476
fe68b953
SM
477 # Start with a fresh gdb.
478 clean_restart ${testfile}
330a7fce 479
b0e16ca5 480 if {![runto_main]} {
fe68b953 481 return 0
330a7fce 482 }
fe68b953
SM
483 delete_breakpoints
484
2a17c803 485 gdb_test_multiline "Sub-class and check temporary breakpoint" \
fe68b953
SM
486 "python" "" \
487 "class temp_bp (gdb.Breakpoint):" "" \
488 " count = 0" "" \
489 " def stop (self):" "" \
490 " self.count = self.count + 1" "" \
491 " return True" "" \
492 "end" ""
493 set ibp_location [gdb_get_line_number "Break at multiply."]
494 gdb_py_test_silent_cmd "python ibp = temp_bp(\"$ibp_location\", temporary=True)" \
495 "Set temporary breakpoint" 0
496 gdb_test "info breakpoints" \
497 "2.*breakpoint.*del.*py-breakpoint\.c:$ibp_location.*" \
498 "Check info breakpoints shows breakpoint with temporary status"
499 gdb_test "python print (ibp.location)" "py-breakpoint\.c:$ibp_location*" \
500 "Check temporary breakpoint location"
501 gdb_test "python print (ibp.temporary)" "True" \
502 "Check breakpoint temporary status"
503 gdb_continue_to_breakpoint "Break at multiply." \
504 ".*$srcfile:$ibp_location.*"
505 gdb_test "python print (ibp.count)" "1" \
506 "Check temporary stop callback executed before deletion."
507 gdb_test "python print (ibp.temporary)" "RuntimeError: Breakpoint 2 is invalid.*" \
508 "Check temporary breakpoint is deleted after being hit"
509 gdb_test "info breakpoints" "No breakpoints or watchpoints.*" \
510 "Check info breakpoints shows temporary breakpoint is deleted"
f76c27b5 511}
330a7fce 512
9f61929f
KS
513# Test address locations.
514
fe68b953 515proc_with_prefix test_bkpt_address {} {
9f61929f
KS
516 global gdb_prompt decimal srcfile
517
518 # Delete all breakpoints
519 delete_breakpoints
520
521 gdb_test "python gdb.Breakpoint(\"*main\")" \
522 ".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
523
524 gdb_py_test_silent_cmd \
525 "python main_loc = gdb.parse_and_eval(\"main\").address" \
526 "eval address of main" 0
527
528 # Python 2 vs 3 ... Check `int' first. If that fails, try `long'.
529 gdb_test_multiple "python main_addr = int(main_loc)" "int value of main" {
530 -re "Traceback.*$gdb_prompt $" {
531 gdb_test_no_output "python main_addr = long(main_loc)" \
532 "long value of main"
533 }
534 -re "$gdb_prompt $" {
535 pass "int value of main"
536 }
537 }
538
539 # Include whitespace in the linespec to double-check proper
540 # grokking of argument to gdb.Breakpoint.
541 gdb_test "python gdb.Breakpoint(\" *{}\".format(str(main_addr)))" \
542 ".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
543}
544
fe68b953 545proc_with_prefix test_bkpt_pending {} {
93daf339
TT
546 delete_breakpoints
547 gdb_breakpoint "nosuchfunction" allow-pending
548 gdb_test "python print (gdb.breakpoints()\[0\].pending)" "True" \
549 "Check pending status of pending breakpoint"
550}
551
dac790e1
TT
552# Helper proc to install an event listener for a given breakpoint
553# event. NAME is the name of the event to listen for.
554proc connect_event {name} {
555 set lambda "lambda x: note_event(\"$name\")"
556 gdb_test_no_output "python gdb.events.$name.connect($lambda)" \
557 "install $name event listener"
558}
559
560# Helper proc to check that the most recently emitted breakpoint event
561# is EXPECTED.
562proc check_last_event {expected} {
563 gdb_test "python print (last_bp_event)" $expected \
564 "check for $expected event"
565}
566
fe68b953 567proc_with_prefix test_bkpt_events {} {
dac790e1
TT
568 global testfile
569
570 clean_restart ${testfile}
571
2a17c803 572 gdb_test_multiline "Create event handler" \
dac790e1
TT
573 "python" "" \
574 "def note_event(arg):" "" \
575 " global last_bp_event" "" \
576 " last_bp_event = arg" "" \
577 "end" ""
578 gdb_test_no_output "python last_bp_event = None"
579
580 connect_event breakpoint_created
581 connect_event breakpoint_modified
582 connect_event breakpoint_deleted
583
584 gdb_breakpoint [gdb_get_line_number "Break at add."]
585 check_last_event breakpoint_created
586 gdb_test_no_output "disable 1"
587 check_last_event breakpoint_modified
588 gdb_test_no_output "delete 1"
589 check_last_event breakpoint_deleted
590}
591
ec72db3e 592proc_with_prefix test_bkpt_explicit_loc {} {
824cc835
PM
593 global srcfile testfile
594
ec72db3e
SM
595 # Start with a fresh gdb.
596 clean_restart ${testfile}
824cc835 597
b0e16ca5 598 if {![runto_main]} {
ec72db3e 599 return 0
824cc835 600 }
ec72db3e
SM
601
602 delete_breakpoints
603
604 set bp_location1 [gdb_get_line_number "Break at multiply."]
605 set bp_location2 [gdb_get_line_number "Break at add."]
606
607 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=$bp_location1)" \
608 "set explicit breakpoint by line" 0
609 gdb_continue_to_breakpoint "break at multiply for explicit line" \
610 ".*Break at multiply.*"
611
612 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=\"+1\")" \
613 "set explicit breakpoint by relative line" 0
614 gdb_continue_to_breakpoint "break at add for relative line" \
615 ".*Break at add.*"
616
617 delete_breakpoints
618 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=\"-1\")" \
619 "set explicit breakpoint by relative negative line" 0
620 gdb_continue_to_breakpoint "break at multiply for negative line" \
621 ".*Break at multiply.*"
622
623 delete_breakpoints
624 gdb_test "python bp1 = gdb.Breakpoint (line=bp1)" \
625 "RuntimeError: Line keyword should be an integer or a string.*" \
626 "set explicit breakpoint by invalid line type"
627
628 delete_breakpoints
629 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (function=\"add\")" \
630 "set explicit breakpoint by function" 0
631 gdb_continue_to_breakpoint "break at function add for function" \
632 ".*Break at function add.*"
633
634 delete_breakpoints
635 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (source=\"$srcfile\", function=\"add\")" \
636 "set explicit breakpoint by source file and function" 0
637 gdb_continue_to_breakpoint "break at function add for source and function" \
638 ".*Break at function add.*"
639
640 delete_breakpoints
641 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (source=\"$srcfile\", line=\"$bp_location2\")" \
642 "set explicit breakpoint by source file and line number" 0
643 gdb_continue_to_breakpoint "break at add for source and line" \
644 ".*Break at add.*"
645
646 delete_breakpoints
647 gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"-source $srcfile -line $bp_location2\")" \
648 "set explicit breakpoint by source file and line number in spec" 0
649 gdb_continue_to_breakpoint "break at add for source and line in spec" \
650 ".*Break at add.*"
651
652 delete_breakpoints
653 gdb_test "python bp1 = gdb.Breakpoint (source=\"$srcfile\")" \
654 "RuntimeError: Specifying a source must also include a line, label or function.*" \
655 "set invalid explicit breakpoint by source only"
656
657 gdb_test "python bp1 = gdb.Breakpoint (source=\"foo.c\", line=\"5\")" \
658 "No source file named foo.*" \
659 "set invalid explicit breakpoint by missing source and line"
660 gdb_test "python bp1 = gdb.Breakpoint (source=\"$srcfile\", line=\"900\")" \
661 "No line 900 in file \"$srcfile\".*" \
662 "set invalid explicit breakpoint by source and invalid line"
663 gdb_test "python bp1 = gdb.Breakpoint (function=\"blah\")" \
664 "Function \"blah\" not defined.*" \
665 "set invalid explicit breakpoint by missing function"
2a8be203
TT
666
667 delete_breakpoints
668 gdb_test "catch throw" "Catchpoint .* \\(throw\\)"
cb1e4e32
PA
669 gdb_test "python print (gdb.breakpoints())" \
670 "\(\)" \
671 "catch throw is not a breakpoint"
824cc835
PM
672}
673
b89641ba
SM
674proc_with_prefix test_bkpt_qualified {} {
675 global decimal hex testfile
676
677 # Start with a fresh gdb.
678 clean_restart ${testfile}
679
680 set one_location_re "Breakpoint $decimal at $hex:.*line $decimal."
681 set two_location_re "Breakpoint $decimal at $hex:.*2 locations."
682
b0e16ca5 683 if {![runto_main]} {
b89641ba
SM
684 return 0
685 }
686
687 # Test the default value of "qualified".
688 delete_breakpoints
689 gdb_test \
690 "python gdb.Breakpoint(\"multiply\")" \
691 $two_location_re \
692 "qualified implicitly false"
693
694 # Test qualified=False.
695 delete_breakpoints
696 gdb_test \
697 "python gdb.Breakpoint(\"multiply\", qualified=False)" \
698 $two_location_re \
699 "qualified false"
700
701 # Test qualified=True.
702 delete_breakpoints
703 gdb_test \
704 "python gdb.Breakpoint(\"multiply\", qualified=True)" \
705 $one_location_re \
706 "qualified true"
707
708 # Test qualified=True with an explicit function.
709 delete_breakpoints
710 gdb_test \
711 "python gdb.Breakpoint(function=\"multiply\", qualified=True)" \
712 $one_location_re \
713 "qualified true and explicit"
714
715 # Test qualified=False with an explicit function.
716 delete_breakpoints
717 gdb_test \
718 "python gdb.Breakpoint(function=\"multiply\", qualified=False)" \
719 $two_location_re \
720 "qualified false and explicit"
721
722 # Test -q in the spec string.
723 delete_breakpoints
724 gdb_test \
725 "python gdb.Breakpoint(\"-q multiply\")" \
726 $one_location_re \
727 "-q in spec string"
728
729 # Test -q in the spec string with explicit location.
730 delete_breakpoints
731 gdb_test \
732 "python gdb.Breakpoint(\"-q -function multiply\")" \
733 $one_location_re \
734 "-q in spec string with explicit location"
735
736 # Test -q in the spec string and qualified=False (-q should win).
737 delete_breakpoints
738 gdb_test \
739 "python gdb.Breakpoint(\"-q multiply\", qualified=False)" \
740 $one_location_re \
741 "-q in spec string and qualified false"
742}
743
bac7c5cf
GB
744proc_with_prefix test_bkpt_probe {} {
745 global decimal hex testfile srcfile
746
747 if { [prepare_for_testing "failed to prepare" ${testfile}-probes \
748 ${srcfile} {debug c++ additional_flags=-DUSE_PROBES}] } {
749 return -1
750 }
751
b0e16ca5 752 if {![runto_main]} {
bac7c5cf
GB
753 return 0
754 }
755
756 gdb_test \
757 "python gdb.Breakpoint(\"-probe test:result_updated\")" \
758 "Breakpoint $decimal at $hex" \
759 "-probe in spec string"
760}
761
6b95f5ad
AB
762proc_with_prefix test_catchpoints {} {
763 global srcfile testfile
764 global gdb_prompt decimal
765
766 # Start with a fresh gdb.
767 clean_restart ${testfile}
768
b0e16ca5 769 if {![runto_main]} {
6b95f5ad
AB
770 return 0
771 }
772
773 # Try to create a catchpoint, currently this isn't supported via
774 # the python api.
775 gdb_test "python gdb.Breakpoint (\"syscall\", type=gdb.BP_CATCHPOINT)" \
776 [multi_line \
777 "gdb.error: BP_CATCHPOINT not supported" \
778 "Error while executing Python code\\."] \
779 "create a catchpoint via the api"
780
781 # Setup a catchpoint.
782 set num "XXX"
783 gdb_test_multiple "catch throw" "" {
784 -re "The feature \'catch throw\' is not supported.*\r\n$gdb_prompt $" {
785 unsupported "catch syscall isn't supported"
786 return -1
787 }
788 -re "Catchpoint ($decimal) \\(throw\\)\r\n$gdb_prompt $" {
789 set num $expect_out(1,string)
790 pass $gdb_test_name
791 }
792 }
793
794 # Look for the catchpoint in the breakpoint list.
795 gdb_test_multiline "scan breakpoint list for BP_CATCHPOINT" \
796 "python" "" \
797 "def scan_bp_list ():" "" \
798 " for b in gdb.breakpoints():" "" \
799 " if b.type == gdb.BP_CATCHPOINT:" "" \
800 " print(\"breakpoint #%d, type BP_CATCHPOINT\" % b.number)" "" \
801 "end" ""
802 gdb_test "python scan_bp_list ()" \
803 "breakpoint #${num}, type BP_CATCHPOINT" \
804 "scan breakpoint for BP_CATCHPOINT"
805
806 # Arrange to print something when GDB stops, then continue to the
807 # catchpoint and check we get the expected event.
808 gdb_test_multiline "setup stop event handler" \
809 "python" "" \
810 "def stop_handler (event):" "" \
811 " if (isinstance (event, gdb.BreakpointEvent)" "" \
812 " and isinstance (event.breakpoint, gdb.Breakpoint)" "" \
813 " and event.breakpoint.type == gdb.BP_CATCHPOINT):" "" \
814 " print (\"Stopped at catchpoint event: %d\" % event.breakpoint.number)" "" \
815 "end" "" \
816 "python gdb.events.stop.connect (stop_handler)" ""
817 gdb_test "continue" "Stopped at catchpoint event: ${num}"
818}
819
bd7ccaa9
PM
820# Test auto-disable is effective when notifying breakpoint_modified.
821
822proc_with_prefix test_bkpt_auto_disable { } {
823 global srcfile testfile hex decimal
824
825 # Start with a fresh gdb.
826 clean_restart ${testfile}
827
b0e16ca5 828 if {![runto_main]} {
bd7ccaa9
PM
829 return 0
830 }
831 delete_breakpoints
832
833 set mult_line [gdb_get_line_number "Break at multiply."]
834 gdb_breakpoint ${mult_line}
835 gdb_test_no_output "enable count 1 2" "one shot enable"
6767cc64
TV
836 # Python 2 doesn't support print in lambda function, so use a named
837 # function instead.
838 gdb_test_multiline "Define print_bp_enabled" \
839 "python" "" \
840 "def print_bp_enabled (bp):" "" \
841 " print (bp.enabled)" "" \
842 "end" ""
843 gdb_test_no_output \
844 "python gdb.events.breakpoint_modified.connect(print_bp_enabled)" \
bd7ccaa9
PM
845 "trap breakpoint_modified event"
846 gdb_test "continue" "False.*" "auto-disabling after enable count reached"
847}
848
330a7fce
DE
849test_bkpt_basic
850test_bkpt_deletion
851test_bkpt_cond_and_cmds
852test_bkpt_invisible
325d39e4 853test_hardware_breakpoints
6b95f5ad 854test_catchpoints
330a7fce
DE
855test_watchpoints
856test_bkpt_internal
857test_bkpt_eval_funcs
858test_bkpt_temporary
9f61929f 859test_bkpt_address
93daf339 860test_bkpt_pending
dac790e1 861test_bkpt_events
824cc835 862test_bkpt_explicit_loc
b89641ba 863test_bkpt_qualified
bac7c5cf 864test_bkpt_probe
bd7ccaa9 865test_bkpt_auto_disable
This page took 3.629144 seconds and 4 git commands to generate.