511 lines
19 KiB
Plaintext
511 lines
19 KiB
Plaintext
# Copyright (C) 2010-2016 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 breakpoints to Guile.
|
|
|
|
load_lib gdb-guile.exp
|
|
|
|
standard_testfile
|
|
|
|
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
|
|
return -1
|
|
}
|
|
|
|
# Skip all tests if Guile scripting is not enabled.
|
|
if { [skip_guile_tests] } { continue }
|
|
|
|
proc test_bkpt_basic { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix "test_bkpt_basic" {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
# Initially there should be one breakpoint: main.
|
|
|
|
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
|
|
"get breakpoint list 1"
|
|
gdb_test "guile (print (car blist))" \
|
|
"<gdb:breakpoint #1 BP_BREAKPOINT enabled noisy hit:1 ignore:0 @main>" \
|
|
"check main breakpoint"
|
|
gdb_test "guile (print (breakpoint-location (car blist)))" \
|
|
"main" "check main breakpoint location"
|
|
|
|
set mult_line [gdb_get_line_number "Break at multiply."]
|
|
gdb_breakpoint ${mult_line}
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
|
|
# Check that the Guile breakpoint code noted the addition of a
|
|
# breakpoint "behind the scenes".
|
|
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
|
|
"get breakpoint list 2"
|
|
gdb_scm_test_silent_cmd "guile (define mult-bkpt (cadr blist))" \
|
|
"get multiply breakpoint"
|
|
gdb_test "guile (print (length blist))" \
|
|
"= 2" "check for two breakpoints"
|
|
gdb_test "guile (print mult-bkpt)" \
|
|
"= #<gdb:breakpoint #2 BP_BREAKPOINT enabled noisy hit:1 ignore:0 @.*scm-breakpoint.c:$mult_line>" \
|
|
"check multiply breakpoint"
|
|
gdb_test "guile (print (breakpoint-location mult-bkpt))" \
|
|
"scm-breakpoint\.c:${mult_line}*" \
|
|
"check multiply breakpoint location"
|
|
|
|
# Check hit and ignore counts.
|
|
gdb_test "guile (print (breakpoint-hit-count mult-bkpt))" \
|
|
"= 1" "check multiply breakpoint hit count"
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-ignore-count! mult-bkpt 4)" \
|
|
"set multiply breakpoint ignore count"
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
gdb_test "guile (print (breakpoint-hit-count mult-bkpt))" \
|
|
"= 6" "check multiply breakpoint hit count 2"
|
|
gdb_test "print result" \
|
|
" = 545" "check expected variable result after 6 iterations"
|
|
|
|
# Test breakpoint is enabled and disabled correctly.
|
|
gdb_breakpoint [gdb_get_line_number "Break at add."]
|
|
gdb_continue_to_breakpoint "Break at add."
|
|
gdb_test "guile (print (breakpoint-enabled? mult-bkpt))" \
|
|
"= #t" "check multiply breakpoint enabled"
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-enabled! mult-bkpt #f)" \
|
|
"set multiply breakpoint disabled"
|
|
gdb_continue_to_breakpoint "Break at add."
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-enabled! mult-bkpt #t)" \
|
|
"set multiply breakpoint enabled"
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
|
|
# Test other getters and setters.
|
|
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
|
|
"get breakpoint list 3"
|
|
gdb_test "guile (print (breakpoint-thread mult-bkpt))" \
|
|
"= #f" "check breakpoint thread"
|
|
gdb_test "guile (print (= (breakpoint-type mult-bkpt) BP_BREAKPOINT))" \
|
|
"= #t" "check breakpoint type"
|
|
gdb_test "guile (print (map breakpoint-number blist))" \
|
|
"= \\(1 2 3\\)" "check breakpoint numbers"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_deletion { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_bkpt_deletion {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
# Test breakpoints are deleted correctly.
|
|
set deltst_location [gdb_get_line_number "Break at multiply."]
|
|
set end_location [gdb_get_line_number "Break at end."]
|
|
gdb_scm_test_silent_cmd "guile (define dp1 (make-breakpoint \"$deltst_location\"))" \
|
|
"create deltst breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! dp1)" \
|
|
"register dp1"
|
|
gdb_breakpoint [gdb_get_line_number "Break at end."]
|
|
gdb_scm_test_silent_cmd "guile (define del-list (breakpoints))" \
|
|
"get breakpoint list 4"
|
|
gdb_test "guile (print (length del-list))" \
|
|
"= 3" "number of breakpoints before delete"
|
|
gdb_continue_to_breakpoint "Break at multiply." \
|
|
".*$srcfile:$deltst_location.*"
|
|
gdb_scm_test_silent_cmd "guile (delete-breakpoint! dp1)" \
|
|
"delete breakpoint"
|
|
gdb_test "guile (print (breakpoint-number dp1))" \
|
|
"ERROR: .*: Invalid object: <gdb:breakpoint> in position 1: #<gdb:breakpoint #-1>.*" \
|
|
"check breakpoint invalidated"
|
|
gdb_scm_test_silent_cmd "guile (set! del-list (breakpoints))" \
|
|
"get breakpoint list 5"
|
|
gdb_test "guile (print (length del-list))" \
|
|
"= 2" "number of breakpoints after delete"
|
|
gdb_continue_to_breakpoint "Break at end." ".*$srcfile:$end_location.*"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_cond_and_cmds { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_bkpt_cond_and_cmds {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
# Test conditional setting.
|
|
set bp_location1 [gdb_get_line_number "Break at multiply."]
|
|
gdb_scm_test_silent_cmd "guile (define bp1 (make-breakpoint \"$bp_location1\"))" \
|
|
"create multiply breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! bp1)" \
|
|
"register bp1"
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-condition! bp1 \"i == 5\")" \
|
|
"set condition"
|
|
gdb_test "guile (print (breakpoint-condition bp1))" \
|
|
"= i == 5" "test condition has been set"
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
gdb_test "print i" \
|
|
"5" "test conditional breakpoint stopped after five iterations"
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-condition! bp1 #f)" \
|
|
"clear condition"
|
|
gdb_test "guile (print (breakpoint-condition bp1))" \
|
|
"= #f" "test condition has been removed"
|
|
gdb_continue_to_breakpoint "Break at multiply."
|
|
gdb_test "print i" "6" "test breakpoint stopped after six iterations"
|
|
|
|
# Test commands.
|
|
gdb_breakpoint [gdb_get_line_number "Break at add."]
|
|
set test {commands $bpnum}
|
|
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
|
|
set test {print "Command for breakpoint has been executed."}
|
|
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
|
|
set test {print result}
|
|
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
|
|
gdb_test "end"
|
|
|
|
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
|
|
"get breakpoint list 6"
|
|
gdb_test "guile (print (breakpoint-commands (list-ref blist (- (length blist) 1))))" \
|
|
"print \"Command for breakpoint has been executed.\".*print result"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_invisible { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_bkpt_invisible {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
# Test invisible breakpoints.
|
|
delete_breakpoints
|
|
set ibp_location [gdb_get_line_number "Break at multiply."]
|
|
gdb_scm_test_silent_cmd "guile (define vbp1 (make-breakpoint \"$ibp_location\" #:internal #f))" \
|
|
"create visible breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! vbp1)" \
|
|
"register vbp1"
|
|
gdb_scm_test_silent_cmd "guile (define vbp (car (breakpoints)))" \
|
|
"get visible breakpoint"
|
|
gdb_test "guile (print vbp)" \
|
|
"= #<gdb:breakpoint #2 BP_BREAKPOINT enabled noisy hit:0 ignore:0 @.*scm-breakpoint.c:$ibp_location>" \
|
|
"check visible bp obj exists"
|
|
gdb_test "guile (print (breakpoint-location vbp))" \
|
|
"scm-breakpoint\.c:$ibp_location*" "check visible breakpoint location"
|
|
gdb_test "guile (print (breakpoint-visible? vbp))" \
|
|
"= #t" "check breakpoint visibility"
|
|
gdb_test "info breakpoints" \
|
|
"scm-breakpoint\.c:$ibp_location.*" \
|
|
"check info breakpoints shows visible breakpoints"
|
|
delete_breakpoints
|
|
gdb_scm_test_silent_cmd "guile (define ibp (make-breakpoint \"$ibp_location\" #:internal #t))" \
|
|
"create invisible breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! ibp)" \
|
|
"register ibp"
|
|
gdb_test "guile (print ibp)" \
|
|
"= #<gdb:breakpoint #-$decimal BP_BREAKPOINT enabled noisy hit:0 ignore:0 @.*scm-breakpoint.c:$ibp_location>" \
|
|
"check invisible bp obj exists"
|
|
gdb_test "guile (print (breakpoint-location ibp))" \
|
|
"scm-breakpoint\.c:$ibp_location*" "check invisible breakpoint location"
|
|
gdb_test "guile (print (breakpoint-visible? ibp))" \
|
|
"= #f" "check breakpoint invisibility"
|
|
gdb_test "info breakpoints" \
|
|
"No breakpoints or watchpoints.*" \
|
|
"check info breakpoints does not show invisible breakpoints"
|
|
gdb_test "maint info breakpoints" \
|
|
"scm-breakpoint\.c:$ibp_location.*" \
|
|
"check maint info breakpoints shows invisible breakpoints"
|
|
}
|
|
}
|
|
|
|
proc test_watchpoints { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_watchpoints {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
# Disable hardware watchpoints if necessary.
|
|
if [target_info exists gdb,no_hardware_watchpoints] {
|
|
gdb_test_no_output "set can-use-hw-watchpoints 0" ""
|
|
}
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
gdb_scm_test_silent_cmd "guile (define wp1 (make-breakpoint \"result\" #:type BP_WATCHPOINT #:wp-class WP_WRITE))" \
|
|
"create watchpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! wp1)" \
|
|
"register wp1"
|
|
gdb_test "continue" \
|
|
".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*main.*" \
|
|
"test watchpoint write"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_internal { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_bkpt_internal {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
# Disable hardware watchpoints if necessary.
|
|
if [target_info exists gdb,no_hardware_watchpoints] {
|
|
gdb_test_no_output "set can-use-hw-watchpoints 0" ""
|
|
}
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_scm_test_silent_cmd "guile (define wp1 (make-breakpoint \"result\" #:type BP_WATCHPOINT #:wp-class WP_WRITE #:internal #t))" \
|
|
"create invisible watchpoint"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! wp1)" \
|
|
"register wp1"
|
|
gdb_test "info breakpoints" \
|
|
"No breakpoints or watchpoints.*" \
|
|
"check info breakpoints does not show invisible watchpoint"
|
|
gdb_test "maint info breakpoints" \
|
|
".*watchpoint.*result.*" \
|
|
"check maint info breakpoints shows invisible watchpoint"
|
|
gdb_test "continue" \
|
|
".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*" \
|
|
"test invisible watchpoint write"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_eval_funcs { } {
|
|
global srcfile testfile hex decimal
|
|
|
|
with_test_prefix test_bkpt_eval_funcs {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
# Disable hardware watchpoints if necessary.
|
|
if [target_info exists gdb,no_hardware_watchpoints] {
|
|
gdb_test_no_output "set can-use-hw-watchpoints 0" ""
|
|
}
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
# Define create-breakpoint! as a convenient wrapper around
|
|
# make-breakpoint, register-breakpoint!
|
|
gdb_test_no_output "guile (define (create-breakpoint! . args) (let ((bp (apply make-breakpoint args))) (register-breakpoint! bp) bp))" \
|
|
"define create-breakpoint!"
|
|
|
|
gdb_test_multiline "data collection breakpoint 1" \
|
|
"guile" "" \
|
|
"(define (make-bp-data) (cons 0 0))" "" \
|
|
"(define bp-data-count car)" "" \
|
|
"(define set-bp-data-count! set-car!)" "" \
|
|
"(define bp-data-inf-i cdr)" "" \
|
|
"(define set-bp-data-inf-i! set-cdr!)" "" \
|
|
"(define (bp-eval-count bkpt) (bp-data-count (object-property bkpt 'bp-data)))" "" \
|
|
"(define (bp-eval-inf-i bkpt) (bp-data-inf-i (object-property bkpt 'bp-data)))" "" \
|
|
"(define (make-bp-eval location)" "" \
|
|
" (let ((bp (create-breakpoint! location)))" "" \
|
|
" (set-object-property! bp 'bp-data (make-bp-data))" "" \
|
|
" (set-breakpoint-stop! bp" "" \
|
|
" (lambda (bkpt)" "" \
|
|
" (let ((data (object-property bkpt 'bp-data))" "" \
|
|
" (inf-i (parse-and-eval \"i\")))" "" \
|
|
" (set-bp-data-count! data (+ (bp-data-count data) 1))" "" \
|
|
" (set-bp-data-inf-i! data inf-i)" "" \
|
|
" (value=? inf-i 3))))" "" \
|
|
" bp))" "" \
|
|
"end" ""
|
|
|
|
gdb_test_multiline "data collection breakpoint 2" \
|
|
"guile" "" \
|
|
"(define (make-bp-also-eval location)" "" \
|
|
" (let ((bp (create-breakpoint! location)))" "" \
|
|
" (set-object-property! bp 'bp-data (make-bp-data))" "" \
|
|
" (set-breakpoint-stop! bp" "" \
|
|
" (lambda (bkpt)" "" \
|
|
" (let* ((data (object-property bkpt 'bp-data))" "" \
|
|
" (count (+ (bp-data-count data) 1)))" "" \
|
|
" (set-bp-data-count! data count)" "" \
|
|
" (= count 9))))" "" \
|
|
" bp))" "" \
|
|
"end" ""
|
|
|
|
gdb_test_multiline "data collection breakpoint 3" \
|
|
"guile" "" \
|
|
"(define (make-bp-basic location)" "" \
|
|
" (let ((bp (create-breakpoint! location)))" "" \
|
|
" (set-object-property! bp 'bp-data (make-bp-data))" "" \
|
|
" bp))" "" \
|
|
"end" ""
|
|
|
|
set bp_location2 [gdb_get_line_number "Break at multiply."]
|
|
set end_location [gdb_get_line_number "Break at end."]
|
|
gdb_scm_test_silent_cmd "guile (define eval-bp1 (make-bp-eval \"$bp_location2\"))" \
|
|
"create eval-bp1 breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (define also-eval-bp1 (make-bp-also-eval \"$bp_location2\"))" \
|
|
"create also-eval-bp1 breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (define never-eval-bp1 (make-bp-also-eval \"$end_location\"))" \
|
|
"create never-eval-bp1 breakpoint"
|
|
gdb_continue_to_breakpoint "Break at multiply." ".*$srcfile:$bp_location2.*"
|
|
gdb_test "print i" "3" "check inferior value matches guile accounting"
|
|
gdb_test "guile (print (bp-eval-inf-i eval-bp1))" \
|
|
"= 3" "check guile accounting matches inferior"
|
|
gdb_test "guile (print (bp-eval-count also-eval-bp1))" \
|
|
"= 4" \
|
|
"check non firing same-location breakpoint eval function was also called at each stop 1"
|
|
gdb_test "guile (print (bp-eval-count eval-bp1))" \
|
|
"= 4" \
|
|
"check non firing same-location breakpoint eval function was also called at each stop 2"
|
|
|
|
# Check we cannot assign a condition to a breakpoint with a stop-func,
|
|
# and cannot assign a stop-func to a breakpoint with a condition.
|
|
|
|
delete_breakpoints
|
|
set cond_bp [gdb_get_line_number "Break at multiply."]
|
|
gdb_scm_test_silent_cmd "guile (define eval-bp1 (make-bp-eval \"$cond_bp\"))" \
|
|
"create eval-bp1 breakpoint 2"
|
|
set test_cond {cond $bpnum}
|
|
gdb_test "$test_cond \"foo==3\"" \
|
|
"Only one stop condition allowed.*"
|
|
gdb_scm_test_silent_cmd "guile (define eval-bp2 (make-bp-basic \"$cond_bp\"))" \
|
|
"create basic breakpoint"
|
|
gdb_scm_test_silent_cmd "guile (set-breakpoint-condition! eval-bp2 \"1==1\")" \
|
|
"set a condition"
|
|
gdb_test_multiline "construct an eval function" \
|
|
"guile" "" \
|
|
"(define (stop-func bkpt)" "" \
|
|
" return #t)" "" \
|
|
"end" ""
|
|
gdb_test "guile (set-breakpoint-stop! eval-bp2 stop-func)" \
|
|
"Only one stop condition allowed.*"
|
|
|
|
# Check that stop-func is run when location has normal bp.
|
|
|
|
delete_breakpoints
|
|
gdb_breakpoint [gdb_get_line_number "Break at multiply."]
|
|
gdb_scm_test_silent_cmd "guile (define check-eval (make-bp-eval \"$bp_location2\"))" \
|
|
"create check-eval breakpoint"
|
|
gdb_test "guile (print (bp-eval-count check-eval))" \
|
|
"= 0" \
|
|
"test that evaluate function has not been yet executed (ie count = 0)"
|
|
gdb_continue_to_breakpoint "Break at multiply." ".*$srcfile:$bp_location2.*"
|
|
gdb_test "guile (print (bp-eval-count check-eval))" \
|
|
"= 1" \
|
|
"test that evaluate function is run when location also has normal bp"
|
|
|
|
# Test watchpoints with stop-func.
|
|
|
|
gdb_test_multiline "watchpoint stop func" \
|
|
"guile" "" \
|
|
"(define (make-wp-eval location)" "" \
|
|
" (let ((wp (create-breakpoint! location #:type BP_WATCHPOINT #:wp-class WP_WRITE)))" "" \
|
|
" (set-breakpoint-stop! wp" "" \
|
|
" (lambda (bkpt)" "" \
|
|
" (let ((result (parse-and-eval \"result\")))" "" \
|
|
" (value=? result 788))))" "" \
|
|
" wp))" "" \
|
|
"end" ""
|
|
|
|
delete_breakpoints
|
|
gdb_scm_test_silent_cmd "guile (define wp1 (make-wp-eval \"result\"))" \
|
|
"create watchpoint"
|
|
gdb_test "continue" ".*\[Ww\]atchpoint.*result.*Old value =.*New value = 788.*" \
|
|
"test watchpoint write"
|
|
|
|
# Misc final tests.
|
|
|
|
gdb_test "guile (print (bp-eval-count never-eval-bp1))" \
|
|
"= 0" \
|
|
"check that this unrelated breakpoints eval function was never called"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_registration {} {
|
|
global srcfile testfile
|
|
|
|
with_test_prefix "test_bkpt_registration" {
|
|
# Start with a fresh gdb.
|
|
clean_restart ${testfile}
|
|
|
|
if ![gdb_guile_runto_main] {
|
|
return
|
|
}
|
|
|
|
# Initially there should be one breakpoint: main.
|
|
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
|
|
"get breakpoint list 1"
|
|
gdb_test "guile (register-breakpoint! (car blist))" \
|
|
"ERROR: .*: not a Scheme breakpoint.*" \
|
|
"try to register a non-guile breakpoint"
|
|
|
|
set bp_location1 [gdb_get_line_number "Break at multiply."]
|
|
gdb_scm_test_silent_cmd "guile (define bp1 (make-breakpoint \"$bp_location1\"))" \
|
|
"create multiply breakpoint"
|
|
gdb_test "guile (print (breakpoint-valid? bp1))" \
|
|
"= #f" "breakpoint invalid after creation"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! bp1)" \
|
|
"register bp1"
|
|
gdb_test "guile (print (breakpoint-valid? bp1))" \
|
|
"= #t" "breakpoint valid after registration"
|
|
gdb_test "guile (register-breakpoint! bp1)" \
|
|
"ERROR: .*: breakpoint is already registered.*" \
|
|
"re-register already registered bp1"
|
|
gdb_scm_test_silent_cmd "guile (delete-breakpoint! bp1)" \
|
|
"delete registered breakpoint"
|
|
gdb_test "guile (print (breakpoint-valid? bp1))" \
|
|
"= #f" "breakpoint invalid after deletion"
|
|
gdb_scm_test_silent_cmd "guile (register-breakpoint! bp1)" \
|
|
"re-register bp1"
|
|
gdb_test "guile (print (breakpoint-valid? bp1))" \
|
|
"= #t" "breakpoint valid after re-registration"
|
|
}
|
|
}
|
|
|
|
proc test_bkpt_address {} {
|
|
global decimal srcfile
|
|
|
|
# Leading whitespace is intentional!
|
|
gdb_scm_test_silent_cmd \
|
|
"guile (define bp1 (make-breakpoint \" *multiply\"))" \
|
|
"create address breakpoint a ' *multiply'" 1
|
|
|
|
gdb_test "guile (register-breakpoint! bp1)" \
|
|
".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
|
|
}
|
|
|
|
test_bkpt_basic
|
|
test_bkpt_deletion
|
|
test_bkpt_cond_and_cmds
|
|
test_bkpt_invisible
|
|
test_watchpoints
|
|
test_bkpt_internal
|
|
test_bkpt_eval_funcs
|
|
test_bkpt_registration
|
|
test_bkpt_address
|