Pedro Alves
78f2c40a12
Fix reconnecting to a gdbserver already debugging multiple processes, I
The multi-target patch will change the remote target's behavior when: - the current inferior is connected to an extended-remote target. - the current inferior is attached to any process. - some other inferior than than the current one is live. In current master, we get: (gdb) tar extended-remote :9999 A program is being debugged already. Kill it? (y or n) While after multi-target, since each inferior may have its own target connection, we'll get: (gdb) tar extended-remote :9999 Already connected to a remote target. Disconnect? (y or n) That change made gdb.server/extended-remote-restart.exp expose a gdb bug, because it made "target remote", via gdb_reconnect, just disconnect from the previous connection, while in current master that command would kill the inferior before disconnecting. In turn, that would make a multi-target gdb find processes already running under control of gdbserver as soon as it reconnects, while in current master there is never any process around when gdb reconnects, since they'd all been killed prior to disconnection. The bug this exposed is that remote_target::remote_add_inferior was always reusing current_inferior() for the new process, even if the current inferior was already bound to a process. In the testcase's case, when we reconnect, the remote is debugging two processes. So we'd bind the first remote process to the empty current inferior the first time, and then bind the second remote process to the same inferior again, essencially losing track of the first process. That resulted in failed assertions when we look up the inferior for the first process by PID. The fix is to still prefer binding to the current inferior (so that plain "target remote" keeps doing what you'd expect), but not reuse the current inferior if it is already bound to a process. This patch tweaks the test to explicitly disconnect before reconnecting, to avoid GDB killing processes, thus making current GDB behave the same as it will behave when the multi-target work lands. That change alone without the GDB fix exposes the bug like so: (gdb) PASS: gdb.server/extended-remote-restart.exp: kill: 0, follow-child 0: disconnect target extended-remote localhost:2350 Remote debugging using localhost:2350 src/gdb/thread.c:93: internal-error: thread_info* inferior_thread(): Assertion `tp' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) The original bug that the testcase was written for was related to killing, (git 9d4a934ce604 ("gdb: Fix assert for extended-remote target (PR gdb/18050)")), but since the testcase tries reconnecting with both explicitly killing and not explicitly killing, I think we're covering the original bug with this testcase change. gdb/ChangeLog: 2020-01-10 Pedro Alves <palves@redhat.com> * remote.c (remote_target::remote_add_inferior): Don't bind a process to the current inferior if the current inferior is already bound to a process. gdb/testsuite/ChangeLog: 2020-01-10 Pedro Alves <palves@redhat.com> * gdb.server/extended-remote-restart.exp (test_reload): Explicitly disconnect before reconnecting.
…
…
…
…
…
…
…
…
…
…
…
…
README for GNU development tools This directory contains various GNU compilers, assemblers, linkers, debuggers, etc., plus their support routines, definitions, and documentation. If you are receiving this as part of a GDB release, see the file gdb/README. If with a binutils release, see binutils/README; if with a libg++ release, see libg++/README, etc. That'll give you info about this package -- supported targets, how to use it, how to report bugs, etc. It is now possible to automatically configure and build a variety of tools with one command. To build all of the tools contained herein, run the ``configure'' script here, e.g.: ./configure make To install them (by default in /usr/local/bin, /usr/local/lib, etc), then do: make install (If the configure script can't determine your type of computer, give it the name as an argument, for instance ``./configure sun4''. You can use the script ``config.sub'' to test whether a name is recognized; if it is, config.sub translates it to a triplet specifying CPU, vendor, and OS.) If you have more than one compiler on your system, it is often best to explicitly set CC in the environment before running configure, and to also set CC when running make. For example (assuming sh/bash/ksh): CC=gcc ./configure make A similar example using csh: setenv CC gcc ./configure make Much of the code and documentation enclosed is copyright by the Free Software Foundation, Inc. See the file COPYING or COPYING.LIB in the various directories, for a description of the GNU General Public License terms under which you can copy the files. REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info on where and how to report problems.
Description
Languages
C
52.1%
Makefile
22.5%
Assembly
12.2%
C++
6.2%
Roff
1.1%
Other
5.3%