[PATCH] [WineDbg]: support for debugging child processes
Eric Pouech
eric.pouech at wanadoo.fr
Sat Feb 10 03:48:52 CST 2007
- added internal flag (AlsoDebugProcChild) to let winedbg debug both parent
and child (in the same WineDbg session)
By default, winedbg doesn't debug a child process after its (debugged)
parent has created it. This is now possible. This is still experimental
code, hence one need to set the flag (AlsoDebugProcChild) to 1 to use this
feature (the default is still not to debug child processes at all).
A+
---
programs/winedbg/debug.l | 2 +-
programs/winedbg/debugger.h | 1 +
programs/winedbg/intvar.h | 4 ++++
programs/winedbg/tgt_active.c | 10 ++++++----
programs/winedbg/winedbg.c | 10 ++++++++++
5 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/programs/winedbg/debug.l b/programs/winedbg/debug.l
index 9613fed..6be0f4c 100644
--- a/programs/winedbg/debug.l
+++ b/programs/winedbg/debug.l
@@ -95,7 +95,7 @@ STRING \"[^\n"]+\"
%x NOPROCESS
%%
/* set to special state when no process is loaded. */
- if (!dbg_curr_process && YYSTATE == INITIAL) {BEGIN(NOPROCESS);}
+ if (!dbg_num_processes() && YYSTATE == INITIAL) {BEGIN(NOPROCESS);}
<<EOF>> { return tEOF; }
<*>\n { BEGIN(INITIAL); syntax_error = 0; return tEOL; }
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 0317247..3ad2bd3 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -421,6 +421,7 @@ extern int dbg_printf(const char
#endif
extern const struct dbg_internal_var* dbg_get_internal_var(const char*);
extern BOOL dbg_interrupt_debuggee(void);
+extern unsigned dbg_num_processes(void);
extern struct dbg_process* dbg_add_process(const struct be_process_io* pio, DWORD pid, HANDLE h);
extern void dbg_set_process_name(struct dbg_process* p, const char* name);
extern struct dbg_process* dbg_get_process(DWORD pid);
diff --git a/programs/winedbg/intvar.h b/programs/winedbg/intvar.h
index 1864211..1763392 100644
--- a/programs/winedbg/intvar.h
+++ b/programs/winedbg/intvar.h
@@ -33,3 +33,7 @@ INTERNAL_VAR(ProcessId, FALSE, &dbg_c
/* symbol manipulation */
INTERNAL_VAR(AlwaysShowThunks, FALSE, NULL, dbg_itype_unsigned_int)
+
+ /* process manipulation */
+INTERNAL_VAR(AlsoDebugProcChild, FALSE, NULL, dbg_itype_unsigned_int)
+
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index d7b744f..5fe93be 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -664,7 +664,7 @@ static void wait_exception(void)
{
DEBUG_EVENT de;
- while (dbg_curr_process && WaitForDebugEvent(&de, INFINITE))
+ while (dbg_num_processes() && WaitForDebugEvent(&de, INFINITE))
{
if (dbg_handle_debug_event(&de)) break;
}
@@ -704,6 +704,7 @@ static unsigned dbg_start_debuggee(LPSTR
{
PROCESS_INFORMATION info;
STARTUPINFOA startup;
+ DWORD flags;
memset(&startup, 0, sizeof(startup));
startup.cb = sizeof(startup);
@@ -713,9 +714,10 @@ static unsigned dbg_start_debuggee(LPSTR
/* FIXME: shouldn't need the CREATE_NEW_CONSOLE, but as usual CUI:s need it
* while GUI:s don't
*/
- if (!CreateProcess(NULL, cmdLine, NULL, NULL,
- FALSE,
- DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS|CREATE_NEW_CONSOLE,
+ flags = DEBUG_PROCESS | CREATE_NEW_CONSOLE;
+ if (!DBG_IVAR(AlsoDebugProcChild)) flags |= DEBUG_ONLY_THIS_PROCESS;
+
+ if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE, flags,
NULL, NULL, &startup, &info))
{
dbg_printf("Couldn't start process '%s'\n", cmdLine);
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 6b60386..f3e9c78 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -242,6 +242,16 @@ const struct dbg_internal_var* dbg_get_i
return NULL;
}
+unsigned dbg_num_processes(void)
+{
+ struct dbg_process* p;
+ unsigned num = 0;
+
+ for (p = dbg_process_list; p; p = p->next)
+ num++;
+ return num;
+}
+
struct dbg_process* dbg_get_process(DWORD pid)
{
struct dbg_process* p;
More information about the wine-patches
mailing list