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@codeweavers.com --- programs/winedbg/gdbproxy.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c index 6e6ff558081..ab8b9bdd07c 100644 --- a/programs/winedbg/gdbproxy.c +++ b/programs/winedbg/gdbproxy.c @@ -1722,6 +1722,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* proc = gdbctx->process; + struct dbg_thread* thrd; + + packet_reply_add(gdbctx, "<threads>"); + LIST_FOR_EACH_ENTRY(thrd, &proc->threads, struct dbg_thread, entry) + { + packet_reply_add(gdbctx, "<thread "); + packet_reply_add(gdbctx, "id=""); + packet_reply_val(gdbctx, thrd->tid, 4); + packet_reply_add(gdbctx, "" name=""); + packet_reply_add(gdbctx, thrd->name); + packet_reply_add(gdbctx, ""/>"); + } + packet_reply_add(gdbctx, "</threads>"); +} + static enum packet_return packet_query(struct gdb_context* gdbctx) { int off, len; @@ -1814,6 +1832,7 @@ static enum packet_return packet_query(struct gdb_context* gdbctx) packet_reply_open(gdbctx); 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; } @@ -1859,6 +1878,14 @@ static enum packet_return packet_query(struct gdb_context* gdbctx) packet_reply_close_xfer(gdbctx, off, len); return packet_done; } + + if (snscanf(gdbctx->in_packet, gdbctx->in_packet_len, "Xfer:threads:read::%x,%x", &off, &len) == 2) + { + 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));