[PATCH 7/8] winedbg: Support qXfer:threads:read request.

Rémi Bernon rbernon at codeweavers.com
Thu Apr 2 08:55:20 CDT 2020


As we don't report fork/vfork/exec events, this allows gdb to request
the list of known threads.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 programs/winedbg/gdbproxy.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 4f1e2a3c2fd8..c15a008c656a 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -1532,6 +1532,24 @@ static void packet_query_libraries(struct gdb_context* gdbctx)
     packet_reply_add(gdbctx, "</library-list>");
 }
 
+static void packet_query_threads(struct gdb_context* gdbctx)
+{
+    struct dbg_process* process = gdbctx->process;
+    struct dbg_thread* thread;
+
+    packet_reply_add(gdbctx, "<threads>");
+    LIST_FOR_EACH_ENTRY(thread, &process->threads, struct dbg_thread, entry)
+    {
+        packet_reply_add(gdbctx, "<thread ");
+        packet_reply_add(gdbctx, "id=\"");
+        packet_reply_val(gdbctx, thread->tid, 4);
+        packet_reply_add(gdbctx, "\" name=\"");
+        packet_reply_add(gdbctx, thread->name);
+        packet_reply_add(gdbctx, "\"/>");
+    }
+    packet_reply_add(gdbctx, "</threads>");
+}
+
 static enum packet_return packet_query(struct gdb_context* gdbctx)
 {
     int off, len;
@@ -1626,6 +1644,7 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
             packet_reply_add(gdbctx, "QStartNoAckMode+;");
             packet_reply_add(gdbctx, "qXfer:features:read+;");
             packet_reply_add(gdbctx, "qXfer:libraries:read+;");
+            packet_reply_add(gdbctx, "qXfer:threads:read+;");
             packet_reply_close(gdbctx);
             return packet_done;
         }
@@ -1677,6 +1696,16 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
             packet_reply_close_xfer(gdbctx, off, len);
             return packet_done;
         }
+
+        if (sscanf(gdbctx->in_packet, "Xfer:threads:read::%x,%x", &off, &len) == 2)
+        {
+            if (!gdbctx->process) return packet_error;
+
+            packet_reply_open_xfer(gdbctx);
+            packet_query_threads(gdbctx);
+            packet_reply_close_xfer(gdbctx, off, len);
+            return packet_done;
+        }
         break;
     }
     ERR("Unhandled query %s\n", debugstr_an(gdbctx->in_packet, gdbctx->in_packet_len));
-- 
2.26.0.rc2




More information about the wine-devel mailing list