From ebd01a94aa9e5714ae517727a1b6c57231ae2a1b Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Thu, 9 Mar 2000 18:46:04 +0000 Subject: [PATCH] Now relying on exception codes to know when debugger is entered for a single step trap. --- debugger/break.c | 6 +++--- debugger/dbg.y | 11 ++++++----- debugger/debug.l | 1 + debugger/debugger.h | 4 ++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/debugger/break.c b/debugger/break.c index db804142c31..d5fa64345e7 100644 --- a/debugger/break.c +++ b/debugger/break.c @@ -321,7 +321,7 @@ void DEBUG_InfoBreakpoints(void) * 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 @@ BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count ) #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 @@ BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count ) #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 30e26ecfd33..f978d6405d7 100644 --- a/debugger/dbg.y +++ b/debugger/dbg.y @@ -41,7 +41,7 @@ int yyerror(char *); } %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 @@ void DEBUG_Exit( DWORD exit_code ) * * 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 @@ BOOL DEBUG_Main( BOOL is_debug, BOOL force ) 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 @@ BOOL DEBUG_Main( BOOL is_debug, BOOL force ) */ 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 de15577be0c..26513ed5d80 100644 --- a/debugger/debug.l +++ b/debugger/debug.l @@ -150,6 +150,7 @@ $gs { yylval.reg = REG_GS; return tREG; } symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; } break|brea|bre|br|b { BEGIN(PATH_EXPECTED); return tBREAK; } +watch|watc|wat { BEGIN(PATH_EXPECTED); return tWATCH; } share|shar|sha { return tSHARE; } locals|local|loca|loc { return tLOCAL; } diff --git a/debugger/debugger.h b/debugger/debugger.h index d51ddc3e50b..1f3d02c6a16 100644 --- a/debugger/debugger.h +++ b/debugger/debugger.h @@ -177,7 +177,7 @@ extern void DEBUG_DelBreakpoint( int num ); 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 @@ extern void DEBUG_ExternalDebugger(void); /* 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