Rémi Bernon : winedbg: Support qXfer:threads:read request.
Alexandre Julliard
julliard at winehq.org
Fri Apr 3 14:55:38 CDT 2020
Module: wine
Branch: master
Commit: c2a381fbed6e823344fc6e76a1d1d20509ffd3c9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c2a381fbed6e823344fc6e76a1d1d20509ffd3c9
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri Apr 3 15:35:46 2020 +0200
winedbg: Support qXfer:threads:read request.
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>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/gdbproxy.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 0c154d0b21..2bc6963992 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -1522,6 +1522,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;
@@ -1614,6 +1632,7 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
packet_reply_open(gdbctx);
packet_reply_add(gdbctx, "QStartNoAckMode+;");
packet_reply_add(gdbctx, "qXfer:libraries:read+;");
+ packet_reply_add(gdbctx, "qXfer:threads:read+;");
if (*target_xml) packet_reply_add(gdbctx, "PacketSize=400;qXfer:features:read+");
packet_reply_close(gdbctx);
return packet_done;
@@ -1655,6 +1674,16 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
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;
+ }
+
if (*target_xml && strncmp(gdbctx->in_packet, "Xfer:features:read:target.xml", 29) == 0)
return packet_reply(gdbctx, target_xml);
break;
More information about the wine-cvs
mailing list