[PATCH 3/3] winedbg: Support QThreadEvents request.
Rémi Bernon
rbernon at codeweavers.com
Tue Apr 7 12:34:18 CDT 2020
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45070
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
The bug was probably already fixed by previous commits. I believe gdb
stopped using its default hooks to detect thread start/stop since we
started advertising a custom target
As this patch is specifically about thread start/stop events, let's say
it fixes the issue.
programs/winedbg/gdbproxy.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 332fb0c9d3b6..72e90e8db19e 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -106,6 +106,7 @@ struct gdb_context
/* Unix environment */
unsigned long wine_segs[3]; /* load addresses of the ELF wine exec segments (text, bss and data) */
BOOL no_ack_mode;
+ BOOL thread_events;
};
static void gdbctx_delete_xpoint(struct gdb_context *gdbctx, struct dbg_thread *thread,
@@ -480,14 +481,18 @@ static BOOL handle_debug_event(struct gdb_context* gdbctx)
de->dwThreadId,
de->u.CreateThread.hThread,
de->u.CreateThread.lpThreadLocalBase);
- return TRUE;
+ if (!gdbctx->thread_events)
+ return TRUE;
+ break;
case EXIT_THREAD_DEBUG_EVENT:
fprintf(stderr, "%08x:%08x: exit thread (%u)\n",
de->dwProcessId, de->dwThreadId, de->u.ExitThread.dwExitCode);
if ((thread = dbg_get_thread(gdbctx->process, de->dwThreadId)))
dbg_del_thread(thread);
- return TRUE;
+ if (!gdbctx->thread_events)
+ return TRUE;
+ break;
case EXIT_PROCESS_DEBUG_EVENT:
fprintf(stderr, "%08x:%08x: exit process (%u)\n",
@@ -886,6 +891,8 @@ static enum packet_return packet_reply_status(struct gdb_context* gdbctx)
packet_reply_open(gdbctx);
packet_reply_add(gdbctx, "T");
packet_reply_val(gdbctx, signal_from_debug_event(&gdbctx->de), 1);
+ if (gdbctx->de.dwDebugEventCode == CREATE_THREAD_DEBUG_EVENT)
+ packet_reply_add(gdbctx, "create:");
packet_reply_add(gdbctx, "thread:");
packet_reply_val(gdbctx, gdbctx->de.dwThreadId, 4);
packet_reply_add(gdbctx, ";");
@@ -902,6 +909,15 @@ static enum packet_return packet_reply_status(struct gdb_context* gdbctx)
packet_reply_close(gdbctx);
return packet_done;
+ case EXIT_THREAD_DEBUG_EVENT:
+ packet_reply_open(gdbctx);
+ packet_reply_add(gdbctx, "w");
+ packet_reply_val(gdbctx, gdbctx->de.u.ExitThread.dwExitCode, 4);
+ packet_reply_add(gdbctx, ";");
+ packet_reply_val(gdbctx, gdbctx->de.dwThreadId, 4);
+ packet_reply_close(gdbctx);
+ return packet_done;
+
case EXIT_PROCESS_DEBUG_EVENT:
packet_reply_open(gdbctx);
packet_reply_add(gdbctx, "W");
@@ -1843,6 +1859,7 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
{
packet_reply_open(gdbctx);
packet_reply_add(gdbctx, "QStartNoAckMode+;");
+ packet_reply_add(gdbctx, "QThreadEvents+;");
packet_reply_add(gdbctx, "qXfer:libraries:read+;");
packet_reply_add(gdbctx, "qXfer:threads:read+;");
packet_reply_add(gdbctx, "qXfer:features:read+;");
@@ -1920,6 +1937,13 @@ static enum packet_return packet_set(struct gdb_context* gdbctx)
return packet_ok;
}
+ if (strncmp(gdbctx->in_packet, "ThreadEvents:", 13) == 0)
+ {
+ if (sscanf(gdbctx->in_packet, "ThreadEvents:%d", &gdbctx->thread_events) != 1)
+ return packet_error;
+ return packet_ok;
+ }
+
return packet_error;
}
--
2.26.0
More information about the wine-devel
mailing list