winedbg: Clean handle_debug_event return value.
As in the previous patch, return TRUE if the debug event should be ignored or FALSE is we should tell gdb. There's no need to have an in_trap context member for that. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2fcf051fae
commit
263c283735
|
@ -102,7 +102,6 @@ struct gdb_context
|
||||||
DEBUG_EVENT de;
|
DEBUG_EVENT de;
|
||||||
DWORD de_reply;
|
DWORD de_reply;
|
||||||
unsigned last_sig;
|
unsigned last_sig;
|
||||||
BOOL in_trap;
|
|
||||||
/* Win32 information */
|
/* Win32 information */
|
||||||
struct dbg_process* process;
|
struct dbg_process* process;
|
||||||
/* Unix environment */
|
/* Unix environment */
|
||||||
|
@ -386,7 +385,7 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_debug_event(struct gdb_context* gdbctx)
|
static BOOL handle_debug_event(struct gdb_context* gdbctx)
|
||||||
{
|
{
|
||||||
DEBUG_EVENT *de = &gdbctx->de;
|
DEBUG_EVENT *de = &gdbctx->de;
|
||||||
struct dbg_thread *thread;
|
struct dbg_thread *thread;
|
||||||
|
@ -405,7 +404,9 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
case CREATE_PROCESS_DEBUG_EVENT:
|
case CREATE_PROCESS_DEBUG_EVENT:
|
||||||
gdbctx->process = dbg_add_process(&be_process_gdbproxy_io, de->dwProcessId,
|
gdbctx->process = dbg_add_process(&be_process_gdbproxy_io, de->dwProcessId,
|
||||||
de->u.CreateProcessInfo.hProcess);
|
de->u.CreateProcessInfo.hProcess);
|
||||||
if (!gdbctx->process) break;
|
if (!gdbctx->process)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
memory_get_string_indirect(gdbctx->process,
|
memory_get_string_indirect(gdbctx->process,
|
||||||
de->u.CreateProcessInfo.lpImageName,
|
de->u.CreateProcessInfo.lpImageName,
|
||||||
de->u.CreateProcessInfo.fUnicode,
|
de->u.CreateProcessInfo.fUnicode,
|
||||||
|
@ -430,7 +431,7 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
dbg_add_thread(gdbctx->process, de->dwThreadId,
|
dbg_add_thread(gdbctx->process, de->dwThreadId,
|
||||||
de->u.CreateProcessInfo.hThread,
|
de->u.CreateProcessInfo.hThread,
|
||||||
de->u.CreateProcessInfo.lpThreadLocalBase);
|
de->u.CreateProcessInfo.lpThreadLocalBase);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case LOAD_DLL_DEBUG_EVENT:
|
case LOAD_DLL_DEBUG_EVENT:
|
||||||
memory_get_string_indirect(gdbctx->process,
|
memory_get_string_indirect(gdbctx->process,
|
||||||
|
@ -445,20 +446,21 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
de->u.LoadDll.nDebugInfoSize);
|
de->u.LoadDll.nDebugInfoSize);
|
||||||
dbg_load_module(gdbctx->process->handle, de->u.LoadDll.hFile, u.buffer,
|
dbg_load_module(gdbctx->process->handle, de->u.LoadDll.hFile, u.buffer,
|
||||||
(DWORD_PTR)de->u.LoadDll.lpBaseOfDll, 0);
|
(DWORD_PTR)de->u.LoadDll.lpBaseOfDll, 0);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case UNLOAD_DLL_DEBUG_EVENT:
|
case UNLOAD_DLL_DEBUG_EVENT:
|
||||||
fprintf(stderr, "%08x:%08x: unload DLL @%p\n",
|
fprintf(stderr, "%08x:%08x: unload DLL @%p\n",
|
||||||
de->dwProcessId, de->dwThreadId, de->u.UnloadDll.lpBaseOfDll);
|
de->dwProcessId, de->dwThreadId, de->u.UnloadDll.lpBaseOfDll);
|
||||||
SymUnloadModule(gdbctx->process->handle,
|
SymUnloadModule(gdbctx->process->handle,
|
||||||
(DWORD_PTR)de->u.UnloadDll.lpBaseOfDll);
|
(DWORD_PTR)de->u.UnloadDll.lpBaseOfDll);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case EXCEPTION_DEBUG_EVENT:
|
case EXCEPTION_DEBUG_EVENT:
|
||||||
TRACE("%08x:%08x: exception code=0x%08x\n", de->dwProcessId,
|
TRACE("%08x:%08x: exception code=0x%08x\n", de->dwProcessId,
|
||||||
de->dwThreadId, de->u.Exception.ExceptionRecord.ExceptionCode);
|
de->dwThreadId, de->u.Exception.ExceptionRecord.ExceptionCode);
|
||||||
|
|
||||||
gdbctx->in_trap = !handle_exception(gdbctx, &de->u.Exception);
|
if (handle_exception(gdbctx, &de->u.Exception))
|
||||||
|
return TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CREATE_THREAD_DEBUG_EVENT:
|
case CREATE_THREAD_DEBUG_EVENT:
|
||||||
|
@ -469,14 +471,14 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
de->dwThreadId,
|
de->dwThreadId,
|
||||||
de->u.CreateThread.hThread,
|
de->u.CreateThread.hThread,
|
||||||
de->u.CreateThread.lpThreadLocalBase);
|
de->u.CreateThread.lpThreadLocalBase);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case EXIT_THREAD_DEBUG_EVENT:
|
case EXIT_THREAD_DEBUG_EVENT:
|
||||||
fprintf(stderr, "%08x:%08x: exit thread (%u)\n",
|
fprintf(stderr, "%08x:%08x: exit thread (%u)\n",
|
||||||
de->dwProcessId, de->dwThreadId, de->u.ExitThread.dwExitCode);
|
de->dwProcessId, de->dwThreadId, de->u.ExitThread.dwExitCode);
|
||||||
if ((thread = dbg_get_thread(gdbctx->process, de->dwThreadId)))
|
if ((thread = dbg_get_thread(gdbctx->process, de->dwThreadId)))
|
||||||
dbg_del_thread(thread);
|
dbg_del_thread(thread);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case EXIT_PROCESS_DEBUG_EVENT:
|
case EXIT_PROCESS_DEBUG_EVENT:
|
||||||
fprintf(stderr, "%08x:%08x: exit process (%u)\n",
|
fprintf(stderr, "%08x:%08x: exit process (%u)\n",
|
||||||
|
@ -486,8 +488,7 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
gdbctx->process = NULL;
|
gdbctx->process = NULL;
|
||||||
/* now signal gdb that we're done */
|
/* now signal gdb that we're done */
|
||||||
gdbctx->last_sig = SIGTERM;
|
gdbctx->last_sig = SIGTERM;
|
||||||
gdbctx->in_trap = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
|
|
||||||
case OUTPUT_DEBUG_STRING_EVENT:
|
case OUTPUT_DEBUG_STRING_EVENT:
|
||||||
memory_get_string(gdbctx->process,
|
memory_get_string(gdbctx->process,
|
||||||
|
@ -495,25 +496,25 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
de->u.DebugString.fUnicode, u.bufferA, sizeof(u.bufferA));
|
de->u.DebugString.fUnicode, u.bufferA, sizeof(u.bufferA));
|
||||||
fprintf(stderr, "%08x:%08x: output debug string (%s)\n",
|
fprintf(stderr, "%08x:%08x: output debug string (%s)\n",
|
||||||
de->dwProcessId, de->dwThreadId, debugstr_a(u.bufferA));
|
de->dwProcessId, de->dwThreadId, debugstr_a(u.bufferA));
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
case RIP_EVENT:
|
case RIP_EVENT:
|
||||||
fprintf(stderr, "%08x:%08x: rip error=%u type=%u\n", de->dwProcessId,
|
fprintf(stderr, "%08x:%08x: rip error=%u type=%u\n", de->dwProcessId,
|
||||||
de->dwThreadId, de->u.RipInfo.dwError, de->u.RipInfo.dwType);
|
de->dwThreadId, de->u.RipInfo.dwError, de->u.RipInfo.dwType);
|
||||||
break;
|
return TRUE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FIXME("%08x:%08x: unknown event (%u)\n",
|
FIXME("%08x:%08x: unknown event (%u)\n",
|
||||||
de->dwProcessId, de->dwThreadId, de->dwDebugEventCode);
|
de->dwProcessId, de->dwThreadId, de->dwDebugEventCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gdbctx->in_trap || !gdbctx->process) return;
|
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(thread, &gdbctx->process->threads, struct dbg_thread, entry)
|
LIST_FOR_EACH_ENTRY(thread, &gdbctx->process->threads, struct dbg_thread, entry)
|
||||||
{
|
{
|
||||||
if (!thread->suspended) SuspendThread(thread->handle);
|
if (!thread->suspended) SuspendThread(thread->handle);
|
||||||
thread->suspended = TRUE;
|
thread->suspended = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_step_or_continue(struct gdb_context* gdbctx, int tid, BOOL step, int sig)
|
static void handle_step_or_continue(struct gdb_context* gdbctx, int tid, BOOL step, int sig)
|
||||||
|
@ -568,7 +569,6 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
|
||||||
if (gdbctx->de.dwDebugEventCode)
|
if (gdbctx->de.dwDebugEventCode)
|
||||||
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, gdbctx->de_reply);
|
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, gdbctx->de_reply);
|
||||||
|
|
||||||
gdbctx->in_trap = FALSE;
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (!WaitForDebugEvent(&gdbctx->de, 10))
|
if (!WaitForDebugEvent(&gdbctx->de, 10))
|
||||||
|
@ -588,11 +588,8 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handle_debug_event(gdbctx);
|
if (!handle_debug_event(gdbctx))
|
||||||
assert(!gdbctx->process ||
|
break;
|
||||||
gdbctx->process->pid == 0 ||
|
|
||||||
gdbctx->de.dwProcessId == gdbctx->process->pid);
|
|
||||||
if (gdbctx->in_trap) break;
|
|
||||||
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
|
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1109,8 +1106,6 @@ static enum packet_return packet_read_registers(struct gdb_context* gdbctx)
|
||||||
dbg_ctx_t ctx;
|
dbg_ctx_t ctx;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
|
|
||||||
if (!thread) return packet_error;
|
if (!thread) return packet_error;
|
||||||
if (!thread->process) return packet_error;
|
if (!thread->process) return packet_error;
|
||||||
if (!(backend = thread->process->be_cpu)) return packet_error;
|
if (!(backend = thread->process->be_cpu)) return packet_error;
|
||||||
|
@ -1134,8 +1129,6 @@ static enum packet_return packet_write_registers(struct gdb_context* gdbctx)
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
|
|
||||||
if (!thread) return packet_error;
|
if (!thread) return packet_error;
|
||||||
if (!thread->process) return packet_error;
|
if (!thread->process) return packet_error;
|
||||||
if (!(backend = thread->process->be_cpu)) return packet_error;
|
if (!(backend = thread->process->be_cpu)) return packet_error;
|
||||||
|
@ -1190,7 +1183,6 @@ static enum packet_return packet_read_memory(struct gdb_context* gdbctx)
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
SIZE_T r = 0;
|
SIZE_T r = 0;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
if (sscanf(gdbctx->in_packet, "%p,%x", &addr, &len) != 2) return packet_error;
|
if (sscanf(gdbctx->in_packet, "%p,%x", &addr, &len) != 2) return packet_error;
|
||||||
if (len <= 0) return packet_error;
|
if (len <= 0) return packet_error;
|
||||||
TRACE("Read %u bytes at %p\n", len, addr);
|
TRACE("Read %u bytes at %p\n", len, addr);
|
||||||
|
@ -1220,7 +1212,6 @@ static enum packet_return packet_write_memory(struct gdb_context* gdbctx)
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
SIZE_T w;
|
SIZE_T w;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
ptr = memchr(gdbctx->in_packet, ':', gdbctx->in_packet_len);
|
ptr = memchr(gdbctx->in_packet, ':', gdbctx->in_packet_len);
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
|
@ -1262,8 +1253,6 @@ static enum packet_return packet_read_register(struct gdb_context* gdbctx)
|
||||||
dbg_ctx_t ctx;
|
dbg_ctx_t ctx;
|
||||||
size_t reg;
|
size_t reg;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
|
|
||||||
if (!thread) return packet_error;
|
if (!thread) return packet_error;
|
||||||
if (!thread->process) return packet_error;
|
if (!thread->process) return packet_error;
|
||||||
if (!(backend = thread->process->be_cpu)) return packet_error;
|
if (!(backend = thread->process->be_cpu)) return packet_error;
|
||||||
|
@ -1295,8 +1284,6 @@ static enum packet_return packet_write_register(struct gdb_context* gdbctx)
|
||||||
size_t reg;
|
size_t reg;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
assert(gdbctx->in_trap);
|
|
||||||
|
|
||||||
if (!thread) return packet_error;
|
if (!thread) return packet_error;
|
||||||
if (!thread->process) return packet_error;
|
if (!thread->process) return packet_error;
|
||||||
if (!(backend = thread->process->be_cpu)) return packet_error;
|
if (!(backend = thread->process->be_cpu)) return packet_error;
|
||||||
|
@ -2245,7 +2232,6 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
|
||||||
gdbctx->other_tid = -1;
|
gdbctx->other_tid = -1;
|
||||||
list_init(&gdbctx->xpoint_list);
|
list_init(&gdbctx->xpoint_list);
|
||||||
gdbctx->last_sig = 0;
|
gdbctx->last_sig = 0;
|
||||||
gdbctx->in_trap = FALSE;
|
|
||||||
gdbctx->process = NULL;
|
gdbctx->process = NULL;
|
||||||
gdbctx->no_ack_mode = FALSE;
|
gdbctx->no_ack_mode = FALSE;
|
||||||
for (i = 0; i < ARRAY_SIZE(gdbctx->wine_segs); i++)
|
for (i = 0; i < ARRAY_SIZE(gdbctx->wine_segs); i++)
|
||||||
|
@ -2261,13 +2247,9 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
|
||||||
assert(gdbctx->process == NULL && gdbctx->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, flags, port)) return FALSE;
|
if (!gdb_startup(gdbctx, flags, port)) return FALSE;
|
||||||
assert(!gdbctx->in_trap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
handle_debug_event(gdbctx);
|
|
||||||
if (gdbctx->in_trap) break;
|
|
||||||
}
|
}
|
||||||
|
else if (!handle_debug_event(gdbctx))
|
||||||
|
break;
|
||||||
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
|
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, DBG_CONTINUE);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in New Issue