| # 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 |