diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/progspace-and-thread.c | 6 | ||||
-rw-r--r-- | gdb/progspace.c | 5 | ||||
-rw-r--r-- | gdb/symfile.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.server/bkpt-other-inferior.exp | 93 |
6 files changed, 117 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bcab1da..3eae3e1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2020-01-10 Aleksandar Paunovic <aleksandar.paunovic@intel.com> + Pedro Alves <palves@redhat.com> + + * progspace-and-thread.c (switch_to_program_space_and_thread): + Assert there's an inferior for PSPACE. Use + switch_to_inferior_no_thread to switch the inferior too. + * progspace.c (program_space::~program_space): Call + clear_symtab_users here, with SYMFILE_DEFER_BP_RESET. + (program_space::free_all_objfiles): Don't call clear_symtab_users + here. + * symfile.c (symbol_file_clear): Call clear_symtab_users here. + 2020-01-10 Pedro Alves <palves@redhat.com> * NEWS: Mention multi-target debugging, "info connections", and diff --git a/gdb/progspace-and-thread.c b/gdb/progspace-and-thread.c index a1824e8..698661d 100644 --- a/gdb/progspace-and-thread.c +++ b/gdb/progspace-and-thread.c @@ -25,8 +25,9 @@ void switch_to_program_space_and_thread (program_space *pspace) { inferior *inf = find_inferior_for_program_space (pspace); + gdb_assert (inf != nullptr); - if (inf != NULL && inf->pid != 0) + if (inf->pid != 0) { thread_info *tp = any_live_thread_of_inferior (inf); @@ -39,6 +40,5 @@ switch_to_program_space_and_thread (program_space *pspace) } } - switch_to_no_thread (); - set_current_program_space (pspace); + switch_to_inferior_no_thread (inf); } diff --git a/gdb/progspace.c b/gdb/progspace.c index 96f8acc..1361040 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -147,6 +147,9 @@ program_space::~program_space () no_shared_libraries (NULL, 0); exec_close (); free_all_objfiles (); + /* Defer breakpoint re-set because we don't want to create new + locations for this pspace which we're tearing down. */ + clear_symtab_users (SYMFILE_DEFER_BP_RESET); if (!gdbarch_has_shared_address_space (target_gdbarch ())) free_address_space (this->aspace); clear_section_table (&this->target_sections); @@ -168,8 +171,6 @@ program_space::free_all_objfiles () while (!objfiles_list.empty ()) objfiles_list.front ()->unlink (); - - clear_symtab_users (0); } /* See progspace.h. */ diff --git a/gdb/symfile.c b/gdb/symfile.c index 0285f8f..d5a797a 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1243,6 +1243,8 @@ symbol_file_clear (int from_tty) current_program_space->free_all_objfiles (); + clear_symtab_users (0); + gdb_assert (symfile_objfile == NULL); if (from_tty) printf_filtered (_("No symbol file now.\n")); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e7bd05a..13ccadb 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2020-01-10 Pedro Alves <palves@redhat.com> + * gdb.server/bkpt-other-inferior.exp: New file. + +2020-01-10 Pedro Alves <palves@redhat.com> + * gdb.base/kill-detach-inferiors-cmd.exp: Adjust expected output of "add-inferior". * gdb.base/quit-live.exp: Likewise. diff --git a/gdb/testsuite/gdb.server/bkpt-other-inferior.exp b/gdb/testsuite/gdb.server/bkpt-other-inferior.exp new file mode 100644 index 0000000..7ad38ea --- /dev/null +++ b/gdb/testsuite/gdb.server/bkpt-other-inferior.exp @@ -0,0 +1,93 @@ +# Copyright 2019-2020 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/>. + +# Test that GDB does not access the remote target's memory when +# setting a breakpoint on a function that only exists in an inferior +# that is not bound to the remote target. + +load_lib gdbserver-support.exp + +standard_testfile server.c + +if { [skip_gdbserver_tests] } { + return 0 +} + +if { [prepare_for_testing "failed to prepare" ${binfile} "${srcfile}" \ + {debug pthreads}] } { + return +} + +# Make sure we're disconnected, in case we're testing with an +# extended-remote board, therefore already connected. +gdb_test "disconnect" ".*" + +# Leave inferior 1 with the exec target, not connected. Add another +# inferior, and connect it to gdbserver. + +gdb_test "add-inferior" "Added inferior 2" \ + "add inferior 2" +gdb_test "inferior 2" "Switching to inferior 2.*" \ + "switch to inferior 2" +gdb_test "file ${binfile}" ".*" "load file in inferior 2" + +set target_exec [gdbserver_download_current_prog] + +# Start GDBserver. +set res [gdbserver_start "" $target_exec] + +# Connect to GDBserver. +set gdbserver_protocol [lindex $res 0] +set gdbserver_gdbport [lindex $res 1] +gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport + +# Discard any symbol files that we have opened. +set test "discard symbol table" +gdb_test_multiple "file" $test { + -re "A program is being debugged already..*Are you sure you want to change the file.*y or n. $" { + gdb_test "y" ".*" $test \ + {Discard symbol table from `.*'\? \(y or n\) } "y" + } +} + +# At this point: +# +# - inferior 1 has symbols, and is not connected to any target. +# - inferior 2 has no symbols, and is connected to gdbserver. + +# Setting a breakpoint at some function by name should set a +# breakpoint on inferior 1, since it has symbols, and should not +# result in any access to inferior 2's remote target. + +gdb_test_no_output "set debug remote 1" + +foreach inf_sel {1 2} { + with_test_prefix "inf $inf_sel" { + gdb_test "inferior $inf_sel" "Switching to inferior $inf_sel.*" \ + "switch to inferior" + + set test "set breakpoint" + gdb_test_multiple "break main" $test { + -re "Sending packet.*$gdb_prompt $" { + fail $test + } + -re "^break main\r\nBreakpoint .* at .*$gdb_prompt $" { + pass $test + } + } + + delete_breakpoints + } +} |