237 lines
6.7 KiB
Plaintext
237 lines
6.7 KiB
Plaintext
# Copyright 2012 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/>.
|
|
|
|
if {[skip_shlib_tests]} {
|
|
return 0
|
|
}
|
|
|
|
load_lib mi-support.exp
|
|
|
|
standard_testfile pending.c
|
|
set libfile1 "pendshr1"
|
|
set libfile2 "pendshr2"
|
|
set executable $testfile
|
|
set libsrc1 $srcdir/$subdir/$libfile1.c
|
|
set libsrc2 $srcdir/$subdir/$libfile2.c
|
|
set lib_sl1 [standard_output_file pendshr1.sl]
|
|
set lib_sl2 [standard_output_file pendshr2.sl]
|
|
set lib_opts "debug"
|
|
|
|
if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
|
|
|| [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
|
|
untested "Could not compile either $libsrc1 or $libsrc2"
|
|
return -1
|
|
}
|
|
|
|
set MIFLAGS "-i=mi"
|
|
|
|
set exec_opts [list debug shlib=$lib_sl1 shlib_load]
|
|
if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
|
|
untested "Failed to compile $srcfile"
|
|
return -1
|
|
}
|
|
|
|
proc test_insert_delete_modify { } {
|
|
global mi_gdb_prompt
|
|
|
|
gdb_exit
|
|
if [mi_gdb_start] {
|
|
continue
|
|
}
|
|
|
|
mi_run_to_main
|
|
|
|
mi_gdb_test "break marker" \
|
|
{(&.*)*.*~"Breakpoint 2 at.*\\n".*=breakpoint-created,bkpt=\{number="2",type="breakpoint".*\}.*\n\^done}
|
|
|
|
# Verify that '=breakpoint-modified' notification is correctly emitted:
|
|
|
|
# 1. when modifying command
|
|
send_gdb "commands\n"
|
|
gdb_expect {
|
|
-re "End with" {
|
|
}
|
|
}
|
|
|
|
send_gdb "silent\nend\n"
|
|
set test "change command"
|
|
gdb_expect {
|
|
-re ".*=breakpoint-modified.*${mi_gdb_prompt}$" {
|
|
pass $test
|
|
}
|
|
-re ".*${mi_gdb_prompt}$" {
|
|
fail $test
|
|
}
|
|
timeout {
|
|
fail "$test (timeout)"
|
|
}
|
|
}
|
|
|
|
# Verify that '=breakpoint-created' notification is correctly emittd when
|
|
# creating any type of breakpoint.
|
|
|
|
set test "watch watch"
|
|
mi_gdb_test ${test} \
|
|
{(&.*)*.*~".*atchpoint 3: .*\\n".*=breakpoint-created,bkpt=\{number="3",type="(hw |)watchpoint".*\}.*\n\^done} \
|
|
$test
|
|
set test "trace marker"
|
|
mi_gdb_test $test \
|
|
{(&.*)*.*~"Tracepoint 4 at .*\\n".*=breakpoint-created,bkpt=\{number="4",type="tracepoint".*\}.*\n\^done} \
|
|
$test
|
|
set test "catch syscall"
|
|
mi_gdb_test $test \
|
|
{(&.*)*.*~"Catchpoint 5 .*\\n".*=breakpoint-created,bkpt=\{number="5",type="catchpoint".*\}.*\n\^done} \
|
|
$test
|
|
set test "dprintf marker, \"arg\" \""
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-created,bkpt=\{number="6",type="dprintf".*\}.*\n\^done} \
|
|
$test
|
|
|
|
# 2. when modifying condition
|
|
set test "condition 2 main > 0x0"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="2",.*,cond=\"main > 0x0\".*\}.*\n\^done} \
|
|
$test
|
|
|
|
# 3. when modifying enableness
|
|
set test "disable 3"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="3",.*,enabled=\"n\".*\}.*\n\^done} \
|
|
$test
|
|
set test "enable 3"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="3",.*,enabled=\"y\".*\}.*\n\^done} \
|
|
$test
|
|
# 4. when modifying ignore count.
|
|
set test "ignore 5 1"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="5",.*,ignore=\"1\".*\}.*\n\^done} \
|
|
$test
|
|
# 5. when modifying pass count.
|
|
setup_kfail gdb/14617 *-*-*
|
|
set test "passcount 1 4"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="4",.*\}.*\n\^done} \
|
|
$test
|
|
|
|
# Delete some breakpoints and verify that '=breakpoint-deleted
|
|
# notification is correctly emitted.
|
|
for {set i 3} {$i < 7} {incr i} {
|
|
mi_gdb_test "delete ${i}" ".*=breakpoint-deleted,id=\"${i}\".*\\^done" \
|
|
"delete ${i}"
|
|
}
|
|
}
|
|
|
|
test_insert_delete_modify
|
|
|
|
# Test 'breakpoint-modified' notification is emited when pending breakpoints are
|
|
# resolved.
|
|
|
|
proc test_pending_resolved { } { with_test_prefix "pending resolved" {
|
|
global decimal hex
|
|
global srcdir
|
|
global subdir
|
|
global binfile
|
|
global lib_sl1 lib_sl2
|
|
global mi_gdb_prompt
|
|
|
|
gdb_exit
|
|
if [mi_gdb_start] {
|
|
continue
|
|
}
|
|
mi_gdb_reinitialize_dir $srcdir/$subdir
|
|
mi_gdb_load ${binfile}
|
|
mi_load_shlibs $lib_sl1 $lib_sl2
|
|
|
|
# Create a pending breakpoint on pendfunc1
|
|
mi_gdb_test "-break-insert -f pendfunc1" \
|
|
{.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
|
|
"insert breakpoint on pendfunc1"
|
|
mi_run_cmd
|
|
|
|
set test "breakpoint on pendfunc1 resolved"
|
|
gdb_expect {
|
|
-re ".*=breakpoint-modified,bkpt=\{number=\"1\".*addr=\"${hex}\".*,times=\"0\"" {
|
|
pass $test
|
|
exp_continue
|
|
}
|
|
-re ".*=breakpoint-modified,bkpt=\{number=\"1\".*addr=\"${hex}\".*,times=\"1\"" {
|
|
pass "$test: hit_count is updated"
|
|
}
|
|
-re ".*${mi_gdb_prompt}$" {
|
|
fail $test
|
|
}
|
|
timeout {
|
|
fail "$test (timeout)"
|
|
}
|
|
}
|
|
mi_expect_stop "breakpoint-hit" "pendfunc1" ""\
|
|
".*" ".*" {"" "disp=\"keep\""} \
|
|
"continue to pendfunc1 breakpoint"
|
|
|
|
# Delete breakpoint on pendfunc1
|
|
mi_gdb_test "-break-delete 1" {\^done} \
|
|
"delete breakpoint on pendfunc1"
|
|
# Insert breakpoint on marker
|
|
mi_gdb_test "-break-insert marker" {.*\^done,bkpt=.*} \
|
|
"insert breakpoint on marker"
|
|
# Create a pending breakpoint on pendfunc3
|
|
mi_gdb_test "-break-insert -f pendfunc3" \
|
|
{.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
|
|
"insert breakpoint on pendfunc3"
|
|
|
|
mi_execute_to "exec-continue" "breakpoint-hit" "marker" ".*" ".*" ".*" \
|
|
{"" "disp=\"keep\""} "continue to marker 1"
|
|
|
|
mi_send_resuming_command "exec-continue" "continuing execution to marker"
|
|
|
|
set test "breakpoint on pendfunc3 resolved"
|
|
gdb_expect {
|
|
-re ".*=breakpoint-modified,bkpt=\{number=\"2\".*addr=\"${hex}\",.*func=\"marker\",.*times=\"1\"" {
|
|
pass "$test: hit_count is updated"
|
|
exp_continue
|
|
}
|
|
-re ".*=breakpoint-modified,bkpt=\{number=\"3\".*addr=\"${hex}\",.*func=\"pendfunc3\",.*times=\"0\"" {
|
|
pass $test
|
|
}
|
|
-re ".*${mi_gdb_prompt}$" {
|
|
fail $test
|
|
}
|
|
timeout {
|
|
fail "$test (timeout)"
|
|
}
|
|
}
|
|
mi_expect_stop "breakpoint-hit" "marker" ".*" ".*" ".*" \
|
|
{"" "disp=\"keep\""} "continue to marker 2"
|
|
|
|
mi_send_resuming_command "exec-continue" "continuing to exit"
|
|
set test "breakpoint on pendfunc3 pending again"
|
|
gdb_expect {
|
|
-re ".*=breakpoint-modified,bkpt=\{number=\"3\".*addr=\"<PENDING>\"" {
|
|
pass $test
|
|
}
|
|
-re ".*${mi_gdb_prompt}$" {
|
|
fail $test
|
|
}
|
|
timeout {
|
|
fail "$test (timeout)"
|
|
}
|
|
}
|
|
|
|
mi_expect_stop "exited-normally" "" "" "" "" "" ""
|
|
}}
|
|
|
|
test_pending_resolved
|