mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
3666a04883
This commits the result of running gdb/copyright.py as per our Start of New Year procedure... gdb/ChangeLog Update copyright year range in copyright header of all GDB files.
260 lines
7.5 KiB
Plaintext
260 lines
7.5 KiB
Plaintext
# Copyright 2012-2021 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 "failed to compile shared library"
|
|
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"
|
|
return -1
|
|
}
|
|
|
|
proc test_insert_delete_modify { } {
|
|
global mi_gdb_prompt
|
|
global lib_sl1 lib_sl2
|
|
global binfile
|
|
|
|
mi_clean_restart $binfile
|
|
|
|
mi_load_shlibs $lib_sl1 $lib_sl2
|
|
|
|
mi_runto_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 emitted 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".*,script=\{\"printf \\\"arg\\\" \\\"\"\}.*\}\r\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
|
|
# Modify condition through MI command shouldn't trigger MI notification.
|
|
mi_gdb_test "-break-condition 2 main == 0x0" "\\^done" \
|
|
"-break-condition 2 main == 0x0"
|
|
|
|
# 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
|
|
# Modify enableness through MI commands shouldn't trigger MI
|
|
# notification.
|
|
mi_gdb_test "-break-enable 3" "\\^done" "-break-enable 3"
|
|
mi_gdb_test "-break-disable 3" "\\^done" "-break-disable 3"
|
|
|
|
# 4. when modifying ignore count.
|
|
set test "ignore 5 1"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="5",.*,ignore=\"1\".*\}.*\n\^done} \
|
|
$test
|
|
# Modify ignore count through MI command shouldn't trigger MI
|
|
# notification.
|
|
mi_gdb_test "-break-after 5 1" "\\^done" \
|
|
"-break-after 5 1"
|
|
|
|
# 5. when modifying pass count.
|
|
set test "passcount 1 4"
|
|
mi_gdb_test $test \
|
|
{.*=breakpoint-modified,bkpt=\{number="4",.*pass="1".*\}.*\n\^done} \
|
|
$test
|
|
# Modify pass count through MI command shouldn't trigger MI
|
|
# notification.
|
|
mi_gdb_test "-break-passcount 4 1" "\\^done" \
|
|
"-break-passcount 4 1"
|
|
|
|
# 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}"
|
|
}
|
|
}
|
|
|
|
with_test_prefix "test_insert_delete_modify" {
|
|
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" "" "" "" "" "" ""
|
|
}
|
|
}
|
|
|
|
with_test_prefix "test_pending_resolved" {
|
|
test_pending_resolved
|
|
}
|