diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2009-03-05 23:45:14 +0000 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2009-03-05 23:45:14 +0000 |
commit | a3247a22136e0b53cf5c40c67ee4f5e8eb92ec32 (patch) | |
tree | f87264eeaaddf26d435bc7553430988fb66560de /gdb/testsuite | |
parent | d36df9c574a35b93e079b0058168474ad6872204 (diff) | |
download | gdb-a3247a22136e0b53cf5c40c67ee4f5e8eb92ec32.zip gdb-a3247a22136e0b53cf5c40c67ee4f5e8eb92ec32.tar.gz gdb-a3247a22136e0b53cf5c40c67ee4f5e8eb92ec32.tar.bz2 |
2009-03-05 Paul Pluzhnikov <ppluzhnikov@google.com>
* printcmd.c (do_one_display): Reparse exp_string.
(display_uses_solib_p): New function.
(clear_dangling_display_expressions): New function.
(_initialize_printcmd): Add observer.
* solib.c (no_shared_libraries): Swap order of calls to
clear_solib and objfile_purge_solibs.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/solib-display-lib.c | 30 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/solib-display-main.c | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/solib-display.exp | 115 |
4 files changed, 183 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e886869..50e61ce 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-03-05 Paul Pluzhnikov <ppluzhnikov@google.com> + + * solib-display.exp: New file. + * solib-display-main.c: New file. + * solib-display-lib.c: New file. + 2009-03-05 Pedro Alves <pedro@codesourcery.com> * gdb.arch/i386-permbkpt.S, gdb.arch/i386-permbkpt.exp: New. diff --git a/gdb/testsuite/gdb.base/solib-display-lib.c b/gdb/testsuite/gdb.base/solib-display-lib.c new file mode 100644 index 0000000..18cb257 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-display-lib.c @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 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 a_global = 41; +#ifndef NO_B_GLOBAL +int b_global = 42; +#endif +int c_global = 43; + +int foo () { + return a_global + +#ifndef NO_B_GLOBAL + b_global + +#endif + c_global; +} diff --git a/gdb/testsuite/gdb.base/solib-display-main.c b/gdb/testsuite/gdb.base/solib-display-main.c new file mode 100644 index 0000000..be2a34a --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-display-main.c @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 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/>. */ + +extern int foo (); + +int main_global = 44; +int bar () +{ + int a_local = 45; + static int a_static = 46; + return main_global + a_local + a_static; /* break here */ +} + +int main () +{ + bar (); + return foo (); +} diff --git a/gdb/testsuite/gdb.base/solib-display.exp b/gdb/testsuite/gdb.base/solib-display.exp new file mode 100644 index 0000000..d4b49f3 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-display.exp @@ -0,0 +1,115 @@ +# Copyright 2009 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/>. +# +# Contributed by Paul Pluzhnikov <ppluzhnikov@google.com> +# + +# This test case verifies that if a display is active on a variable +# which belongs in a shared library, and that shared library is +# reloaded (e.g. due to re-execution of the program), GDB will continue +# to display it (gdb-6.8 crashed under this scenario). + +# Also test that a display of variable which is currently present in +# a shared library, but disappears before re-run, doesn't cause GDB +# difficulties, and that it continues to display other variables. + +# Finally, test that displays which refer to main executable +# (and thus aren't affected by shared library unloading) are not +# disabled prematurely. + +if [skip_shlib_tests] then { + return 0 +} + +# Library file. +set libname "solib-display-lib" +set srcfile_lib ${srcdir}/${subdir}/${libname}.c +set binfile_lib ${objdir}/${subdir}/${libname}.so +set lib_flags [list debug] +# Binary file. +set testfile "solib-display-main" +set srcfile ${srcdir}/${subdir}/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +set bin_flags [list debug shlib=${binfile_lib}] + +if [get_compiler_info ${binfile}] { + return -1 +} + +if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != "" + || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { + untested "Could not compile $binfile_lib or $binfile." + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + fail "Can't run to main" + return 0 +} + +gdb_test "display a_global" "1: a_global = 41" +gdb_test "display b_global" "2: b_global = 42" +gdb_test "display c_global" "3: c_global = 43" + +if { [gdb_start_cmd] < 0 } { + fail "Can't run to main (2)" + return 0 +} + +gdb_test "" "3: c_global = 43\\r\\n2: b_global = 42\\r\\n1: a_global = 41" "after rerun" + +# Now rebuild the library without b_global +if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} \ + "$lib_flags additional_flags=-DNO_B_GLOBAL"] != ""} { + fail "Can't rebuild $binfile_lib" +} + +if { [gdb_start_cmd] < 0 } { + fail "Can't run to main (3)" + return 0 +} + +gdb_test "" "3: c_global = 43\\r\\nwarning: .*b_global.*\\r\\n1: a_global = 41" "after rerun" + +# Now verify that displays which are not in the shared library +# are not cleared permaturely. + +gdb_test "break [gdb_get_line_number "break here" ${testfile}.c]" \ + ".*Breakpoint.* at .*" + +gdb_test "continue" +gdb_test "display main_global" "4: main_global = 44" +gdb_test "display a_local" "5: a_local = 45" +gdb_test "display a_static" "6: a_static = 46" + +if { [gdb_start_cmd] < 0 } { + fail "Can't run to main (4)" + return 0 +} + +gdb_test "" "6: a_static = 46\\r\\n4: main_global = 44\\r\\n.*" +gdb_test "break [gdb_get_line_number "break here" ${testfile}.c]" \ + ".*Breakpoint.* at .*" +gdb_test "continue" "6: a_static = 46\\r\\n5: a_local = 45\\r\\n4: main_global = 44\\r\\n.*" + +gdb_exit + +return 0 + + |