Commit 7af48607 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

winedbg: Store the current debug event in gdbctx.

parent b434af66
...@@ -87,6 +87,7 @@ struct gdb_context ...@@ -87,6 +87,7 @@ struct gdb_context
int exec_tid; /* tid used in step & continue */ int exec_tid; /* tid used in step & continue */
int other_tid; /* tid to be used in any other operation */ int other_tid; /* tid to be used in any other operation */
/* current Win32 trap env */ /* current Win32 trap env */
DEBUG_EVENT de;
unsigned last_sig; unsigned last_sig;
BOOL in_trap; BOOL in_trap;
/* Win32 information */ /* Win32 information */
...@@ -393,8 +394,10 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e ...@@ -393,8 +394,10 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
return ret; return ret;
} }
static void handle_debug_event(struct gdb_context* gdbctx, DEBUG_EVENT* de) static void handle_debug_event(struct gdb_context* gdbctx)
{ {
DEBUG_EVENT *de = &gdbctx->de;
union { union {
char bufferA[256]; char bufferA[256];
WCHAR buffer[256]; WCHAR buffer[256];
...@@ -575,12 +578,10 @@ static BOOL check_for_interrupt(struct gdb_context* gdbctx) ...@@ -575,12 +578,10 @@ static BOOL check_for_interrupt(struct gdb_context* gdbctx)
static void wait_for_debuggee(struct gdb_context* gdbctx) static void wait_for_debuggee(struct gdb_context* gdbctx)
{ {
DEBUG_EVENT de;
gdbctx->in_trap = FALSE; gdbctx->in_trap = FALSE;
for (;;) for (;;)
{ {
if (!WaitForDebugEvent(&de, 10)) if (!WaitForDebugEvent(&gdbctx->de, 10))
{ {
if (GetLastError() == ERROR_SEM_TIMEOUT) if (GetLastError() == ERROR_SEM_TIMEOUT)
{ {
...@@ -589,7 +590,7 @@ static void wait_for_debuggee(struct gdb_context* gdbctx) ...@@ -589,7 +590,7 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
ERR("Failed to break into debuggee\n"); ERR("Failed to break into debuggee\n");
break; break;
} }
WaitForDebugEvent(&de, INFINITE); WaitForDebugEvent(&gdbctx->de, INFINITE);
} else { } else {
continue; continue;
} }
...@@ -597,13 +598,13 @@ static void wait_for_debuggee(struct gdb_context* gdbctx) ...@@ -597,13 +598,13 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
break; break;
} }
} }
handle_debug_event(gdbctx, &de); handle_debug_event(gdbctx);
assert(!gdbctx->process || assert(!gdbctx->process ||
gdbctx->process->pid == 0 || gdbctx->process->pid == 0 ||
de.dwProcessId == gdbctx->process->pid); gdbctx->de.dwProcessId == gdbctx->process->pid);
assert(!dbg_curr_thread || de.dwThreadId == dbg_curr_thread->tid); assert(!dbg_curr_thread || gdbctx->de.dwThreadId == dbg_curr_thread->tid);
if (gdbctx->in_trap) break; if (gdbctx->in_trap) break;
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
} }
} }
...@@ -1880,7 +1881,7 @@ static BOOL gdb_exec(const char* wine_path, unsigned port, unsigned flags) ...@@ -1880,7 +1881,7 @@ static BOOL gdb_exec(const char* wine_path, unsigned port, unsigned flags)
return TRUE; return TRUE;
} }
static BOOL gdb_startup(struct gdb_context* gdbctx, DEBUG_EVENT* de, unsigned flags, unsigned port) static BOOL gdb_startup(struct gdb_context* gdbctx, unsigned flags, unsigned port)
{ {
int sock; int sock;
struct sockaddr_in s_addrs = {0}; struct sockaddr_in s_addrs = {0};
...@@ -1906,7 +1907,7 @@ static BOOL gdb_startup(struct gdb_context* gdbctx, DEBUG_EVENT* de, unsigned fl ...@@ -1906,7 +1907,7 @@ static BOOL gdb_startup(struct gdb_context* gdbctx, DEBUG_EVENT* de, unsigned fl
goto cleanup; goto cleanup;
/* step 2: do the process internal creation */ /* step 2: do the process internal creation */
handle_debug_event(gdbctx, de); handle_debug_event(gdbctx);
/* step3: get the wine loader name */ /* step3: get the wine loader name */
if (!dbg_get_debuggee_info(gdbctx->process->handle, &imh_mod)) if (!dbg_get_debuggee_info(gdbctx->process->handle, &imh_mod))
...@@ -1969,7 +1970,6 @@ cleanup: ...@@ -1969,7 +1970,6 @@ cleanup:
static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigned port) static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigned port)
{ {
DEBUG_EVENT de;
int i; int i;
gdbctx->sock = -1; gdbctx->sock = -1;
...@@ -1991,23 +1991,23 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne ...@@ -1991,23 +1991,23 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
gdbctx->wine_segs[i] = 0; gdbctx->wine_segs[i] = 0;
/* wait for first trap */ /* wait for first trap */
while (WaitForDebugEvent(&de, INFINITE)) while (WaitForDebugEvent(&gdbctx->de, INFINITE))
{ {
if (de.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) if (gdbctx->de.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT)
{ {
/* this should be the first event we get, /* this should be the first event we get,
* and the only one of this type */ * and the only one of this type */
assert(gdbctx->process == NULL && de.dwProcessId == dbg_curr_pid); assert(gdbctx->process == NULL && gdbctx->de.dwProcessId == dbg_curr_pid);
/* gdbctx->dwProcessId = pid; */ /* gdbctx->dwProcessId = pid; */
if (!gdb_startup(gdbctx, &de, flags, port)) return FALSE; if (!gdb_startup(gdbctx, flags, port)) return FALSE;
assert(!gdbctx->in_trap); assert(!gdbctx->in_trap);
} }
else else
{ {
handle_debug_event(gdbctx, &de); handle_debug_event(gdbctx);
if (gdbctx->in_trap) break; if (gdbctx->in_trap) break;
} }
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
} }
return TRUE; return TRUE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment