• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

GNU Binutils with patches for OS216


Commit MetaInfo

Revisiónbab2e736d54c5e26aea3015c84a3b283b5f78c82 (tree)
Tiempo2019-09-07 07:31:05
AutorPedro Alves <palves@redh...>
CommiterPedro Alves

Log Message

Tweak handling of remote errors in response to resumption packet

With current master, on a Fedora 27 machine with a kernel with buggy
watchpoint support, I see:

(gdb) PASS: gdb.threads/watchpoint-fork.exp: parent: singlethreaded: hardware breakpoints work
continue
Continuing.
warning: Remote failure reply: E01
Remote communication error. Target disconnected.: Connection reset by peer.
(gdb) FAIL: gdb.threads/watchpoint-fork.exp: parent: singlethreaded: watchpoints work
continue
The program is not being run.
(gdb) FAIL: gdb.threads/watchpoint-fork.exp: parent: singlethreaded: breakpoint after the first fork (the program is no longer running)

The FAILs themselves aren't what's interesting here. What is
interesting is that with the main multi-target patch applied, I was getting this:

(gdb) PASS: gdb.threads/watchpoint-fork.exp: parent: singlethreaded: hardware breakpoints work
continue
Continuing.
warning: Remote failure reply: E01
/home/pedro/brno/pedro/gdb/binutils-gdb-2/build/../src/gdb/inferior.c:285: internal-error: inferior* find_inferior_pid(process_stratum_target*, int): Assertion pid != 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) FAIL: gdb.threads/watchpoint-fork.exp: parent: singlethreaded: watchpoints work (GDB internal error)

The problem is that in remote_target::wait_as, we're hitting this:

switch (buf[0])
{
case 'E': /* Error of some sort. */
/* We're out of sync with the target now. Did it continue or

not? Not is more likely, so report a stop. */

rs->waiting_for_stop_reply = 0;
warning (_("Remote failure reply: %s"), buf);
status->kind = TARGET_WAITKIND_STOPPED;
status->value.sig = GDB_SIGNAL_0;
break;

which leaves event_ptid as null_ptid. At the end of the function, we then reach:

else if (status->kind != TARGET_WAITKIND_EXITED

&& status->kind != TARGET_WAITKIND_SIGNALLED)

{
if (event_ptid != null_ptid)

record_currthread (rs, event_ptid);

else

event_ptid = inferior_ptid; <<<<< here

}

and the trouble is that with the multi-target patch, we'll get here
with inferior_ptid as null_ptid too. That is done exactly to find
these implicit assumptions that inferior_ptid is a good choice for
default thread, which isn't generaly true.

I first thought of fixing this in the "case 'E'" path, but, given that
this "event_ptid = inferior_ptid" path is also taken when the remote
target does not support threads at all, no thread-related packets or
extensions, it's better to fix it in latter path, to handle all
scenarios that miss reporting a thread.

That's what this patch does.

gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>

* remote.c (first_remote_resumed_thread): New.
(remote_target::wait_as): Use it as default event_ptid instead of
inferior_ptid.

Cambiar Resumen

Diferencia incremental

--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -7703,6 +7703,17 @@ remote_target::wait_ns (ptid_t ptid, struct target_waitstatus *status, int optio
77037703 }
77047704 }
77057705
7706+/* Return the first resumed thread. */
7707+
7708+static ptid_t
7709+first_remote_resumed_thread ()
7710+{
7711+ for (thread_info *tp : all_non_exited_threads (minus_one_ptid))
7712+ if (tp->resumed)
7713+ return tp->ptid;
7714+ return null_ptid;
7715+}
7716+
77067717 /* Wait until the remote machine stops, then return, storing status in
77077718 STATUS just as `wait' would. */
77087719
@@ -7839,7 +7850,7 @@ remote_target::wait_as (ptid_t ptid, target_waitstatus *status, int options)
78397850 if (event_ptid != null_ptid)
78407851 record_currthread (rs, event_ptid);
78417852 else
7842- event_ptid = inferior_ptid;
7853+ event_ptid = first_remote_resumed_thread ();
78437854 }
78447855 else
78457856 /* A process exit. Invalidate our notion of current thread. */