[PATCH v2] winedbg: gdb proxy mode: support qAttached packet
Paul Bolle
pebolle at tiscali.nl
Mon Aug 30 06:21:34 CDT 2010
Add support for the qAttached packet. Main benefit is that gdb now will
ask if it should detach from the debuggee if it was attached to a
debuggee instead of asking whether the debuggee should be killed. (It
still will ask whether the debuggee should be killed if it launched the
debuggee itself).
Signed-off-by: Paul Bolle <pebolle at tiscali.nl>
---
On Wed, 2009-11-04 at 21:42 +0100, Eric Pouech wrote:
> [...] inclusion in gdbctx is preferred (and storage should rather be an
> integer rather than a string pointer)
programs/winedbg/gdbproxy.c | 25 +++++++++++++++++++++----
1 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 4f12481..0f5088c 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -109,6 +109,8 @@ struct gdb_context
struct gdb_ctx_Xpoint Xpoints[NUM_XPOINT];
/* Unix environment */
unsigned long wine_segs[3]; /* load addresses of the ELF wine exec segments (text, bss and data) */
+ /* attached or launched? */
+ int attached;
};
static BOOL tgt_process_gdbproxy_read(HANDLE hProcess, const void* addr,
@@ -1794,6 +1796,15 @@ static enum packet_return packet_query(struct gdb_context* gdbctx)
return packet_done;
}
break;
+ case 'A':
+ /* Since gdb's multiprocess protocol extensions aren't supported, this
+ * shouldn't be "qAttached:PID", just "qAttached", but check anyway. */
+ if (gdbctx->in_packet_len == 8 && strncmp(gdbctx->in_packet, "Attached", 8) == 0)
+ {
+ packet_reply(gdbctx, gdbctx->attached ? "1": "0", 1);
+ return packet_done;
+ }
+ break;
case 'C':
if (gdbctx->in_packet_len == 1)
{
@@ -2179,6 +2190,7 @@ static int fetch_data(struct gdb_context* gdbctx)
#define FLAG_NO_START 1
#define FLAG_WITH_XTERM 2
+#define FLAG_ATTACHED 4
static BOOL gdb_exec(const char* wine_path, unsigned port, unsigned flags)
{
@@ -2318,6 +2330,7 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags)
gdbctx->in_trap = FALSE;
gdbctx->trace = /*GDBPXY_TRC_PACKET | GDBPXY_TRC_COMMAND |*/ GDBPXY_TRC_COMMAND_ERROR | GDBPXY_TRC_COMMAND_FIXME | GDBPXY_TRC_WIN32_EVENT;
gdbctx->process = NULL;
+ gdbctx->attached = (flags & FLAG_ATTACHED) ? 1 : 0;
for (i = 0; i < NUM_XPOINT; i++)
gdbctx->Xpoints[i].type = -1;
for (i = 0; i < sizeof(gdbctx->wine_segs) / sizeof(gdbctx->wine_segs[0]); i++)
@@ -2350,6 +2363,7 @@ static int gdb_remote(unsigned flags)
struct pollfd pollfd;
struct gdb_context gdbctx;
BOOL doLoop;
+ BOOL kill;
for (doLoop = gdb_init_context(&gdbctx, flags); doLoop;)
{
@@ -2365,8 +2379,8 @@ static int gdb_remote(unsigned flags)
{
if (gdbctx.trace & GDBPXY_TRC_LOWLEVEL)
fprintf(stderr, "Gdb hung up\n");
- /* kill also debuggee process - questionnable - */
- detach_debuggee(&gdbctx, TRUE);
+ kill = (flags & FLAG_ATTACHED) ? FALSE : TRUE;
+ detach_debuggee(&gdbctx, kill);
doLoop = FALSE;
break;
}
@@ -2412,8 +2426,11 @@ int gdb_main(int argc, char* argv[])
}
return -1;
}
- if (dbg_active_attach(argc, argv) == start_ok ||
- dbg_active_launch(argc, argv) == start_ok)
+ if (dbg_active_attach(argc, argv) == start_ok) {
+ gdb_flags |= FLAG_ATTACHED;
+ return gdb_remote(gdb_flags);
+ }
+ else if (dbg_active_launch(argc, argv) == start_ok)
return gdb_remote(gdb_flags);
#else
fprintf(stderr, "GdbProxy mode not supported on this platform\n");
--
1.7.2.1
More information about the wine-devel
mailing list