From c2a381fbed6e823344fc6e76a1d1d20509ffd3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Fri, 3 Apr 2020 15:35:46 +0200 Subject: [PATCH] winedbg: Support qXfer:threads:read request. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Alexandre Julliard --- programs/winedbg/gdbproxy.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c index 0c154d0b21c..2bc69639925 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, ""); } +static void packet_query_threads(struct gdb_context* gdbctx) +{ + struct dbg_process* process = gdbctx->process; + struct dbg_thread* thread; + + packet_reply_add(gdbctx, ""); + LIST_FOR_EACH_ENTRY(thread, &process->threads, struct dbg_thread, entry) + { + packet_reply_add(gdbctx, "tid, 4); + packet_reply_add(gdbctx, "\" name=\""); + packet_reply_add(gdbctx, thread->name); + packet_reply_add(gdbctx, "\"/>"); + } + packet_reply_add(gdbctx, ""); +} + 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;