This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit+7.6] [patch] Fix remote.c incorrectly using pop_target (wrt btrace)
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Pedro Alves <palves at redhat dot com>
- Cc: Yao Qi <yao at codesourcery dot com>, gdb-patches at sourceware dot org, "Metzger, Markus T" <markus dot t dot metzger at intel dot com>
- Date: Fri, 22 Mar 2013 20:15:50 +0100
- Subject: [commit+7.6] [patch] Fix remote.c incorrectly using pop_target (wrt btrace)
- References: <20130311172836 dot GA22575 at host2 dot jankratochvil dot net> <513EFD81 dot 6050401 at codesourcery dot com> <20130315195451 dot GB19841 at host2 dot jankratochvil dot net> <514C8D99 dot 2060809 at redhat dot com>
On Fri, 22 Mar 2013 17:58:01 +0100, Pedro Alves wrote:
> On 03/15/2013 07:54 PM, Jan Kratochvil wrote:
>
> > gdb/
> > 2013-03-15 Jan Kratochvil <jan.kratochvil@redhat.com>
> >
> > * remote.c (remote_unpush_target): New function.
> > (remote_open_1): Remove two pop_target calls, update one comment, add
> > comment to target_preopen call. Replace pop_target call by
> > remote_unpush_target call.
> > (interrupt_query, readchar, getpkt_or_notif_sane_1): Replace
> > pop_target calls by remote_unpush_target calls.
> >
>
> Thanks. I think this is fine.
Checked in:
http://sourceware.org/ml/gdb-cvs/2013-03/msg00193.html
and for 7.6.
http://sourceware.org/ml/gdb-cvs/2013-03/msg00194.html
(This one has additional ", 0" for the QUITTING parameter.)
> I notice that some targets, like spu-multiarch.c or dec-thread.c
> don't seem to be very prepared to be brute-force deactivated. E.g.,
> those targets (and linux-thread-db.c and bsd-uthread.c too), probably
> more) are deactivated when symbols or shared libraries are unloaded,
> and their to_close methods don't take care of cleaning up the target's
> variables / local state. A similar scenario that doesn't
> involve remote, is when going from 'threaded core debugging'
> -> 'non-threaded core debugging'. But since target_pre_inferior
> discards the DSOs of the current inferior, and these targets are
> generally not multi-inferior aware, I guess things end up alright.
> This is very much a preexisting wart. I suspect we'll end up
> getting back to this at some not-so-distant point. :-)
OK, I did not notice before.
Thanks,
Jan
http://sourceware.org/ml/gdb-cvs/2013-03/msg00193.html
--- src/gdb/ChangeLog 2013/03/22 14:52:26 1.15301
+++ src/gdb/ChangeLog 2013/03/22 19:07:03 1.15302
@@ -1,3 +1,12 @@
+2013-03-22 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * remote.c (remote_unpush_target): New function.
+ (remote_open_1): Remove two pop_target calls, update one comment, add
+ comment to target_preopen call. Replace pop_target call by
+ remote_unpush_target call.
+ (interrupt_query, readchar, getpkt_or_notif_sane_1): Replace
+ pop_target calls by remote_unpush_target calls.
+
2013-03-22 Pedro Alves <palves@redhat.com>
* linux-nat.c (linux_child_follow_fork): Don't call
--- src/gdb/remote.c 2013/03/20 15:46:24 1.530
+++ src/gdb/remote.c 2013/03/22 19:07:03 1.531
@@ -4188,6 +4188,14 @@
}
}
+/* Remove any of the remote.c targets from target stack. Upper targets depend
+ on it so remove them first. */
+
+static void
+remote_unpush_target (void)
+{
+ pop_all_targets_above (process_stratum - 1);
+}
static void
remote_open_1 (char *name, int from_tty,
@@ -4205,30 +4213,18 @@
wait_forever_enabled_p = 1;
/* If we're connected to a running target, target_preopen will kill it.
- But if we're connected to a target system with no running process,
- then we will still be connected when it returns. Ask this question
- first, before target_preopen has a chance to kill anything. */
+ Ask this question first, before target_preopen has a chance to kill
+ anything. */
if (remote_desc != NULL && !have_inferiors ())
{
- if (!from_tty
- || query (_("Already connected to a remote target. Disconnect? ")))
- pop_target ();
- else
+ if (from_tty
+ && !query (_("Already connected to a remote target. Disconnect? ")))
error (_("Still connected."));
}
+ /* Here the possibly existing remote target gets unpushed. */
target_preopen (from_tty);
- unpush_target (target);
-
- /* This time without a query. If we were connected to an
- extended-remote target and target_preopen killed the running
- process, we may still be connected. If we are starting "target
- remote" now, the extended-remote target will not have been
- removed by unpush_target. */
- if (remote_desc != NULL && !have_inferiors ())
- pop_target ();
-
/* Make sure we send the passed signals list the next time we resume. */
xfree (last_pass_packet);
last_pass_packet = NULL;
@@ -4348,7 +4344,7 @@
/* Pop the partially set up target - unless something else did
already before throwing the exception. */
if (remote_desc != NULL)
- pop_target ();
+ remote_unpush_target ();
if (target_async_permitted)
wait_forever_enabled_p = 1;
throw_exception (ex);
@@ -5096,7 +5092,7 @@
if (query (_("Interrupted while waiting for the program.\n\
Give up (and stop debugging it)? ")))
{
- pop_target ();
+ remote_unpush_target ();
deprecated_throw_reason (RETURN_QUIT);
}
}
@@ -7051,11 +7047,11 @@
switch ((enum serial_rc) ch)
{
case SERIAL_EOF:
- pop_target ();
+ remote_unpush_target ();
error (_("Remote connection closed"));
/* no return */
case SERIAL_ERROR:
- pop_target ();
+ remote_unpush_target ();
perror_with_name (_("Remote communication error. "
"Target disconnected."));
/* no return */
@@ -7579,7 +7575,7 @@
if (forever) /* Watchdog went off? Kill the target. */
{
QUIT;
- pop_target ();
+ remote_unpush_target ();
error (_("Watchdog timeout has expired. Target detached."));
}
if (remote_debug)