[PATCH 4/5] winedbg: Clean handle_debug_event return value.
Rémi Bernon
rbernon at codeweavers.com
Sat Apr 4 04:30:16 CDT 2020
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 at codeweavers.com>
---
programs/winedbg/gdbproxy.c | 58 +++++++++++++------------------------
1 file changed, 20 insertions(+), 38 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 5b7fdaa83eb4..3d605e4fd076 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -102,7 +102,6 @@ struct gdb_context
DEBUG_EVENT de;
DWORD de_reply;
unsigned last_sig;
- BOOL in_trap;
/* Win32 information */
struct dbg_process* process;
/* 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;
struct dbg_thread *thread;
@@ -405,7 +404,9 @@ static void handle_debug_event(struct gdb_context* gdbctx)
case CREATE_PROCESS_DEBUG_EVENT:
gdbctx->process = dbg_add_process(&be_process_gdbproxy_io, de->dwProcessId,
de->u.CreateProcessInfo.hProcess);
- if (!gdbctx->process) break;
+ if (!gdbctx->process)
+ return TRUE;
+
memory_get_string_indirect(gdbctx->process,
de->u.CreateProcessInfo.lpImageName,
de->u.CreateProcessInfo.fUnicode,
@@ -430,7 +431,7 @@ static void handle_debug_event(struct gdb_context* gdbctx)
dbg_add_thread(gdbctx->process, de->dwThreadId,
de->u.CreateProcessInfo.hThread,
de->u.CreateProcessInfo.lpThreadLocalBase);
- break;
+ return TRUE;
case LOAD_DLL_DEBUG_EVENT:
memory_get_string_indirect(gdbctx->process,
@@ -445,20 +446,21 @@ static void handle_debug_event(struct gdb_context* gdbctx)
de->u.LoadDll.nDebugInfoSize);
dbg_load_module(gdbctx->process->handle, de->u.LoadDll.hFile, u.buffer,
(DWORD_PTR)de->u.LoadDll.lpBaseOfDll, 0);
- break;
+ return TRUE;
case UNLOAD_DLL_DEBUG_EVENT:
fprintf(stderr, "%08x:%08x: unload DLL @%p\n",
de->dwProcessId, de->dwThreadId, de->u.UnloadDll.lpBaseOfDll);
SymUnloadModule(gdbctx->process->handle,
(DWORD_PTR)de->u.UnloadDll.lpBaseOfDll);
- break;
+ return TRUE;
case EXCEPTION_DEBUG_EVENT:
TRACE("%08x:%08x: exception code=0x%08x\n", de->dwProcessId,
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;
case CREATE_THREAD_DEBUG_EVENT:
@@ -469,14 +471,14 @@ static void handle_debug_event(struct gdb_context* gdbctx)
de->dwThreadId,
de->u.CreateThread.hThread,
de->u.CreateThread.lpThreadLocalBase);
- break;
+ return TRUE;
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);
- break;
+ return TRUE;
case EXIT_PROCESS_DEBUG_EVENT:
fprintf(stderr, "%08x:%08x: exit process (%u)\n",
@@ -486,8 +488,7 @@ static void handle_debug_event(struct gdb_context* gdbctx)
gdbctx->process = NULL;
/* now signal gdb that we're done */
gdbctx->last_sig = SIGTERM;
- gdbctx->in_trap = TRUE;
- break;
+ return FALSE;
case OUTPUT_DEBUG_STRING_EVENT:
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));
fprintf(stderr, "%08x:%08x: output debug string (%s)\n",
de->dwProcessId, de->dwThreadId, debugstr_a(u.bufferA));
- break;
+ return TRUE;
case RIP_EVENT:
fprintf(stderr, "%08x:%08x: rip error=%u type=%u\n", de->dwProcessId,
de->dwThreadId, de->u.RipInfo.dwError, de->u.RipInfo.dwType);
- break;
+ return TRUE;
default:
FIXME("%08x:%08x: unknown event (%u)\n",
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)
{
if (!thread->suspended) SuspendThread(thread->handle);
thread->suspended = TRUE;
}
+
+ return FALSE;
}
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)
ContinueDebugEvent(gdbctx->de.dwProcessId, gdbctx->de.dwThreadId, gdbctx->de_reply);
- gdbctx->in_trap = FALSE;
for (;;)
{
if (!WaitForDebugEvent(&gdbctx->de, 10))
@@ -588,11 +588,8 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
break;
}
}
- handle_debug_event(gdbctx);
- assert(!gdbctx->process ||
- gdbctx->process->pid == 0 ||
- gdbctx->de.dwProcessId == gdbctx->process->pid);
- if (gdbctx->in_trap) break;
+ if (!handle_debug_event(gdbctx))
+ break;
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;
size_t i;
- assert(gdbctx->in_trap);
-
if (!thread) return packet_error;
if (!thread->process) 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;
size_t i;
- assert(gdbctx->in_trap);
-
if (!thread) return packet_error;
if (!thread->process) 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];
SIZE_T r = 0;
- assert(gdbctx->in_trap);
if (sscanf(gdbctx->in_packet, "%p,%x", &addr, &len) != 2) return packet_error;
if (len <= 0) return packet_error;
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];
SIZE_T w;
- assert(gdbctx->in_trap);
ptr = memchr(gdbctx->in_packet, ':', gdbctx->in_packet_len);
if (ptr == NULL)
{
@@ -1262,8 +1253,6 @@ static enum packet_return packet_read_register(struct gdb_context* gdbctx)
dbg_ctx_t ctx;
size_t reg;
- assert(gdbctx->in_trap);
-
if (!thread) return packet_error;
if (!thread->process) 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;
char *ptr;
- assert(gdbctx->in_trap);
-
if (!thread) return packet_error;
if (!thread->process) 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;
list_init(&gdbctx->xpoint_list);
gdbctx->last_sig = 0;
- gdbctx->in_trap = FALSE;
gdbctx->process = NULL;
gdbctx->no_ack_mode = FALSE;
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);
/* gdbctx->dwProcessId = pid; */
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);
}
return TRUE;
--
2.26.0
More information about the wine-devel
mailing list