Now relying on exception codes to know when debugger is entered for a
single step trap.
diff --git a/debugger/break.c b/debugger/break.c
index db80414..d5fa643 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -321,7 +321,7 @@
* Determine if we should continue execution after a SIGTRAP signal when
* executing in the given mode.
*/
-BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count )
+BOOL DEBUG_ShouldContinue( DWORD code, enum exec_mode mode, int * count )
{
DBG_ADDR addr;
DBG_ADDR cond_addr;
@@ -330,7 +330,7 @@
#ifdef __i386__
/* If not single-stepping, back up over the int3 instruction */
- if (!(DEBUG_context.EFlags & STEP_FLAG))
+ if (code == EXCEPTION_BREAKPOINT)
DEBUG_context.Eip--;
#endif
@@ -427,7 +427,7 @@
#ifdef __i386__
/* If there's no breakpoint and we are not single-stepping, then we */
/* must have encountered an int3 in the Windows program; let's skip it. */
- if ((bpnum == -1) && !(DEBUG_context.EFlags & STEP_FLAG))
+ if ((bpnum == -1) && code == EXCEPTION_BREAKPOINT)
DEBUG_context.Eip++;
#endif
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 30e26ec..f978d64 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -41,7 +41,7 @@
}
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
-%token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tABORT tDEBUGMSG
+%token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT
%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
%token tPROCESS tMODREF
%token tEOL tSTRING tDEBUGSTR
@@ -407,7 +407,7 @@
*
* Debugger main loop.
*/
-BOOL DEBUG_Main( BOOL is_debug, BOOL force )
+BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code )
{
int newmode;
BOOL ret_ok;
@@ -430,14 +430,16 @@
fprintf( stderr, " in 16-bit code (%04x:%04lx).\n",
(WORD)DEBUG_context.SegCs, DEBUG_context.Eip );
#else
- fprintf( stderr, " (%p).\n", GET_IP(DEBUG_CurrThread->context) );
+ fprintf( stderr, " (%p).\n", GET_IP(&DEBUG_context) );
#endif
}
if (DEBUG_LoadEntryPoints("Loading new modules symbols:\n"))
DEBUG_ProcessDeferredDebug();
- if (force || !(is_debug && DEBUG_ShouldContinue( DEBUG_CurrThread->dbg_exec_mode, &DEBUG_CurrThread->dbg_exec_count )))
+ if (force || !(is_debug && DEBUG_ShouldContinue( code,
+ DEBUG_CurrThread->dbg_exec_mode,
+ &DEBUG_CurrThread->dbg_exec_count )))
{
DBG_ADDR addr;
DEBUG_GetCurrentAddress( &addr );
@@ -525,7 +527,6 @@
*/
if ((DEBUG_CurrThread->dbg_exec_mode == EXEC_CONT) || (DEBUG_CurrThread->dbg_exec_mode == EXEC_PASS))
DEBUG_CurrThread->dbg_exec_count = 0;
-
/* EPP if (USER_Driver) USER_Driver->pEndDebugging(); */
return (DEBUG_CurrThread->dbg_exec_mode == EXEC_PASS) ? 0 : DBG_CONTINUE;
diff --git a/debugger/debug.l b/debugger/debug.l
index de15577..26513ed 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -150,6 +150,7 @@
<INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; }
<INITIAL,INFO_CMD,DEL_CMD>break|brea|bre|br|b { BEGIN(PATH_EXPECTED); return tBREAK; }
+<INITIAL>watch|watc|wat { BEGIN(PATH_EXPECTED); return tWATCH; }
<INFO_CMD>share|shar|sha { return tSHARE; }
<INFO_CMD>locals|local|loca|loc { return tLOCAL; }
diff --git a/debugger/debugger.h b/debugger/debugger.h
index d51ddc3..1f3d02c 100644
--- a/debugger/debugger.h
+++ b/debugger/debugger.h
@@ -177,7 +177,7 @@
extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
extern void DEBUG_InfoBreakpoints(void);
extern BOOL DEBUG_HandleTrap(void);
-extern BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count );
+extern BOOL DEBUG_ShouldContinue( DWORD code, enum exec_mode mode, int * count );
extern void DEBUG_SuspendExecution( void );
extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
extern BOOL DEBUG_IsFctReturn(void);
@@ -362,7 +362,7 @@
/* debugger/dbg.y */
extern void DEBUG_Exit( DWORD exit_code );
-extern BOOL DEBUG_Main( BOOL is_debug, BOOL force );
+extern BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code );
/* Choose your allocator! */
#if 1