attach command no longer worked as expected. this should fix it A+ -- Eric Pouech
Name: wd_attach ChangeLog: License: X11 GenDate: 2003/02/01 10:55:31 UTC ModifiedFiles: programs/winedbg/debugger.h programs/winedbg/winedbg.c programs/winedbg/dbg.y AddedFiles: =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/debugger.h,v retrieving revision 1.4 diff -u -u -r1.4 debugger.h --- programs/winedbg/debugger.h 30 Jan 2003 00:24:18 -0000 1.4 +++ programs/winedbg/debugger.h 1 Feb 2003 09:29:52 -0000 @@ -531,7 +531,7 @@ extern int DEBUG_Printf(int chn, const char* format, ...); #endif extern DBG_INTVAR* DEBUG_GetIntVar(const char*); -extern BOOL DEBUG_Attach(DWORD pid, BOOL cofe); +extern BOOL DEBUG_Attach(DWORD pid, BOOL cofe, BOOL wfe); extern BOOL DEBUG_Detach(void); extern void DEBUG_Run(const char* args); extern DBG_PROCESS* DEBUG_AddProcess(DWORD pid, HANDLE h, const char* imageName); Index: programs/winedbg/winedbg.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/winedbg.c,v retrieving revision 1.4 diff -u -u -r1.4 winedbg.c --- programs/winedbg/winedbg.c 9 Jan 2003 06:00:09 -0000 1.4 +++ programs/winedbg/winedbg.c 1 Feb 2003 10:30:04 -0000 @@ -303,17 +303,40 @@ DBG_free(t); } -BOOL DEBUG_Attach(DWORD pid, BOOL cofe) +static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de); + +/****************************************************************** + * DEBUG_Attach + * + * Sets the debuggee to <pid> + * cofe instructs winedbg what to do when first exception is received + * (break=FALSE, continue=TRUE) + * wfe is set to TRUE if DEBUG_Attach should also proceed with all debug events + * until the first exception is received (aka: attach to an already running process) + */ +BOOL DEBUG_Attach(DWORD pid, BOOL cofe, BOOL wfe) { + DEBUG_EVENT de; + if (!(DEBUG_CurrProcess = DEBUG_AddProcess(pid, 0, NULL))) return FALSE; if (!DebugActiveProcess(pid)) { DEBUG_Printf(DBG_CHN_MESG, "Can't attach process %lx: error %ld\n", pid, GetLastError()); DEBUG_DelProcess(DEBUG_CurrProcess); - DEBUG_CurrProcess = NULL; return FALSE; } DEBUG_CurrProcess->continue_on_first_exception = cofe; + + if (wfe) /* shall we proceed all debug events until we get an exception ? */ + { + DEBUG_InteractiveP = FALSE; + while (DEBUG_CurrProcess && WaitForDebugEvent(&de, INFINITE)) + { + if (DEBUG_HandleDebugEvent(&de)) break; + ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); + } + if (DEBUG_CurrProcess) DEBUG_InteractiveP = TRUE; + } return TRUE; } @@ -329,7 +352,6 @@ SetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context); DebugActiveProcessStop(DEBUG_CurrProcess->pid); DEBUG_DelProcess(DEBUG_CurrProcess); - DEBUG_CurrProcess = NULL; /* FIXME: should zero out the symbol table too */ return TRUE; } @@ -1040,18 +1062,18 @@ if (local_mode == none_mode) local_mode = winedbg_mode; - /* try the from <myself> pid */ + /* try the form <myself> pid */ if (DEBUG_CurrPid == 0 && argc == 2) { char* ptr; DEBUG_CurrPid = strtol(argv[1], &ptr, 10); if (DEBUG_CurrPid == 0 || ptr == NULL || - !DEBUG_Attach(DEBUG_CurrPid, local_mode != gdb_mode)) + !DEBUG_Attach(DEBUG_CurrPid, local_mode != gdb_mode, FALSE)) DEBUG_CurrPid = 0; } - /* try the from <myself> pid evt (Win32 JIT debugger) */ + /* try the form <myself> pid evt (Win32 JIT debugger) */ if (DEBUG_CurrPid == 0 && argc == 3) { HANDLE hEvent; @@ -1061,7 +1083,7 @@ if ((pid = strtol(argv[1], &ptr, 10)) != 0 && ptr != NULL && (hEvent = (HANDLE)strtol(argv[2], &ptr, 10)) != 0 && ptr != NULL) { - if (!DEBUG_Attach(pid, TRUE)) + if (!DEBUG_Attach(pid, TRUE, FALSE)) { /* don't care about result */ SetEvent(hEvent); Index: programs/winedbg/dbg.y =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/dbg.y,v retrieving revision 1.5 diff -u -u -r1.5 dbg.y --- programs/winedbg/dbg.y 30 Jan 2003 00:24:18 -0000 1.5 +++ programs/winedbg/dbg.y 1 Feb 2003 09:42:42 -0000 @@ -150,9 +150,9 @@ | tSYMBOLFILE pathname tEOL { DEBUG_ReadSymbolTable($2, 0); } | tSYMBOLFILE pathname tNUM tEOL { DEBUG_ReadSymbolTable($2, $3); } | tWHATIS expr_addr tEOL { DEBUG_PrintType(&$2); DEBUG_FreeExprMem(); } - | tATTACH tNUM tEOL { DEBUG_Attach($2, FALSE); } + | tATTACH tNUM tEOL { DEBUG_Attach($2, FALSE, TRUE); } | tDETACH tEOL { return DEBUG_Detach(); /* FIXME: we shouldn't return, but since we cannot simply clean the symbol table, exit debugger for now */ } | list_command | disassemble_command @@ -426,7 +427,7 @@ /*********************************************************************** * DEBUG_Parser * - * Debugger editline parser + * Debugger command line parser */ void DEBUG_Parser(LPCSTR filename) { @@ -453,7 +454,7 @@ do { __TRY - { + { ret_ok = TRUE; yyparse(); }