diff options
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/break-interp.exp | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/catch-load-so.c | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/catch-load.c | 35 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/catch-load.exp | 120 | ||||
-rw-r--r-- | gdb/testsuite/lib/mi-support.exp | 2 |
6 files changed, 189 insertions, 1 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bad0406..33a7e08 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2012-01-24 Tom Tromey <tromey@redhat.com> + + * lib/mi-support.exp (mi_expect_stop): Add special case for + solib-event. + * gdb.base/catch-load-so.c: New file. + * gdb.base/catch-load.exp: New file. + * gdb.base/catch-load.c: New file. + * gdb.base/break-interp.exp (reach_1): Update regexp. + 2012-01-24 Jan Kratochvil <jan.kratochvil@redhat.com> Fix fuzzy results. diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index 5882cfe..04b5eab 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -155,7 +155,7 @@ proc reach_1 {func command displacement} { pass $test } } - -re "Stopped due to shared library event\r\n$gdb_prompt $" { + -re "Stopped due to (spurious )?shared library event.*\r\n$gdb_prompt $" { if {$func == "_dl_debug_state"} { if {$debug_state_count == 0} { # First stop does not yet relocate the _start function diff --git a/gdb/testsuite/gdb.base/catch-load-so.c b/gdb/testsuite/gdb.base/catch-load-so.c new file mode 100644 index 0000000..9676479 --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-load-so.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + 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/>. */ + +int +f(void) +{ + return 23; +} diff --git a/gdb/testsuite/gdb.base/catch-load.c b/gdb/testsuite/gdb.base/catch-load.c new file mode 100644 index 0000000..170f581 --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-load.c @@ -0,0 +1,35 @@ +/* This testcase is part of GDB, the GNU debugger. + + 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/>. */ + +#include <dlfcn.h> +#include <stdio.h> + +/* This is updated by the .exp file. */ +char *libname = "catch-load-so.so"; + +int +main () +{ + void *h; + + h = dlopen (libname, RTLD_LAZY); + + dlclose (h); + + h = NULL; /* final breakpoint here */ + return 0; +} diff --git a/gdb/testsuite/gdb.base/catch-load.exp b/gdb/testsuite/gdb.base/catch-load.exp new file mode 100644 index 0000000..af7114a --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-load.exp @@ -0,0 +1,120 @@ +# 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]} { + untested catch-load.exp + return -1 +} + +if {[get_compiler_info not-used]} { + warning "Could not get compiler info" + untested catch-load.exp + return -1 +} + +set testfile catch-load +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug shlib_load}] != "" } { + untested catch-load.exp + return -1 +} + +set testfile2 catch-load-so +set srcfile2 ${testfile2}.c +set binfile2 ${objdir}/${subdir}/${testfile2}.so +set binfile2_dlopen [shlib_target_file ${testfile2}.so] +if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcfile2}" ${binfile2} {debug}] != "" } { + untested catch-load.exp + return -1 +} + +# Run one set of tests. +# SCENARIO is the name of the test scenario, it is just used in test +# names. +# KIND is passed to the "catch" command. +# MATCH is a boolean saying whether we expect the catchpoint to be hit. +proc one_catch_load_test {scenario kind match sostop} { + global verbose testfile testfile2 binfile2_dlopen + global pf_prefix srcfile + global decimal gdb_prompt + + set saved_prefix $pf_prefix + append pf_prefix "${scenario}:" + + clean_restart $testfile + gdb_load_shlibs $binfile2_dlopen + + if {![runto_main]} { + fail "can't run to main" + set pf_prefix $saved_prefix + return + } + + gdb_breakpoint [gdb_get_line_number "final breakpoint here"] + gdb_test_no_output "set var libname = \"$binfile2_dlopen\"" + gdb_test_no_output "set stop-on-solib-events $sostop" + gdb_test "catch $kind" "Catchpoint $decimal \\(.*\\)" + + send_gdb "continue\n" + gdb_test_multiple "continue" "continue" { + -re "Catchpoint $decimal\r\n.*loaded .*/$testfile2.*\r\n.*$gdb_prompt $" { + if {$match} { + pass "continue" + } else { + fail "continue" + } + } + + -re "Stopped due to shared library event.*\r\n$gdb_prompt $" { + if {$sostop} { + pass "continue" + } else { + fail "continue" + } + } + + -re "Breakpoint $decimal, .*\r\n$gdb_prompt $" { + if {!$match} { + pass "continue" + } else { + fail "continue" + } + } + + -re ".*$gdb_prompt $" { + fail "continue" + } + } + + set pf_prefix $saved_prefix +} + +one_catch_load_test "plain load" "load" 1 0 +one_catch_load_test "plain load with stop-on-solib-events" "load" 1 1 +one_catch_load_test "rx load" "load $testfile2" 1 0 +one_catch_load_test "rx load with stop-on-solib-events" "load $testfile2" 1 1 +one_catch_load_test "non-matching load" "load zardoz" 0 0 +one_catch_load_test "non-matching load with stop-on-solib-events" \ + "load zardoz" 0 1 + +one_catch_load_test "plain unload" "unload" 1 0 +one_catch_load_test "plain unload with stop-on-solib-events" "unload" 1 1 +one_catch_load_test "rx unload" "unload $testfile2" 1 0 +one_catch_load_test "rx unload with stop-on-solib-events" \ + "unload $testfile2" 1 1 +one_catch_load_test "non-matching unload" "unload zardoz" 0 0 +one_catch_load_test "non-matching unload with stop-on-solib-events" \ + "unload zardoz" 0 1 diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index 4d40a1e..206f7b3 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -1060,6 +1060,8 @@ proc mi_expect_stop { reason func args file line extra test } { set bn "" if { $reason == "breakpoint-hit" } { set bn {bkptno="[0-9]+",} + } elseif { $reason == "solib-event" } { + set bn ".*" } set r "" |