Now relying on exception codes to know when debugger is entered for a

single step trap.
This commit is contained in:
Eric Pouech 2000-03-09 18:46:04 +00:00 committed by Alexandre Julliard
parent cbb7a172f1
commit ebd01a94aa
4 changed files with 12 additions and 10 deletions

View file

@ -321,7 +321,7 @@ void DEBUG_InfoBreakpoints(void)
* Determine if we should continue execution after a SIGTRAP signal when * Determine if we should continue execution after a SIGTRAP signal when
* executing in the given mode. * 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 addr;
DBG_ADDR cond_addr; DBG_ADDR cond_addr;
@ -330,7 +330,7 @@ BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count )
#ifdef __i386__ #ifdef __i386__
/* If not single-stepping, back up over the int3 instruction */ /* If not single-stepping, back up over the int3 instruction */
if (!(DEBUG_context.EFlags & STEP_FLAG)) if (code == EXCEPTION_BREAKPOINT)
DEBUG_context.Eip--; DEBUG_context.Eip--;
#endif #endif
@ -427,7 +427,7 @@ BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count )
#ifdef __i386__ #ifdef __i386__
/* If there's no breakpoint and we are not single-stepping, then we */ /* 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. */ /* 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++; DEBUG_context.Eip++;
#endif #endif

View file

@ -41,7 +41,7 @@ int yyerror(char *);
} }
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN %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 tCLASS tMAPS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
%token tPROCESS tMODREF %token tPROCESS tMODREF
%token tEOL tSTRING tDEBUGSTR %token tEOL tSTRING tDEBUGSTR
@ -407,7 +407,7 @@ void DEBUG_Exit( DWORD exit_code )
* *
* Debugger main loop. * Debugger main loop.
*/ */
BOOL DEBUG_Main( BOOL is_debug, BOOL force ) BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code )
{ {
int newmode; int newmode;
BOOL ret_ok; BOOL ret_ok;
@ -430,14 +430,16 @@ BOOL DEBUG_Main( BOOL is_debug, BOOL force )
fprintf( stderr, " in 16-bit code (%04x:%04lx).\n", fprintf( stderr, " in 16-bit code (%04x:%04lx).\n",
(WORD)DEBUG_context.SegCs, DEBUG_context.Eip ); (WORD)DEBUG_context.SegCs, DEBUG_context.Eip );
#else #else
fprintf( stderr, " (%p).\n", GET_IP(DEBUG_CurrThread->context) ); fprintf( stderr, " (%p).\n", GET_IP(&DEBUG_context) );
#endif #endif
} }
if (DEBUG_LoadEntryPoints("Loading new modules symbols:\n")) if (DEBUG_LoadEntryPoints("Loading new modules symbols:\n"))
DEBUG_ProcessDeferredDebug(); 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; DBG_ADDR addr;
DEBUG_GetCurrentAddress( &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)) if ((DEBUG_CurrThread->dbg_exec_mode == EXEC_CONT) || (DEBUG_CurrThread->dbg_exec_mode == EXEC_PASS))
DEBUG_CurrThread->dbg_exec_count = 0; DEBUG_CurrThread->dbg_exec_count = 0;
/* EPP if (USER_Driver) USER_Driver->pEndDebugging(); */ /* EPP if (USER_Driver) USER_Driver->pEndDebugging(); */
return (DEBUG_CurrThread->dbg_exec_mode == EXEC_PASS) ? 0 : DBG_CONTINUE; return (DEBUG_CurrThread->dbg_exec_mode == EXEC_PASS) ? 0 : DBG_CONTINUE;

View file

@ -150,6 +150,7 @@ $gs { yylval.reg = REG_GS; return tREG; }
<INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; } <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,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>share|shar|sha { return tSHARE; }
<INFO_CMD>locals|local|loca|loc { return tLOCAL; } <INFO_CMD>locals|local|loca|loc { return tLOCAL; }

View file

@ -177,7 +177,7 @@ extern void DEBUG_DelBreakpoint( int num );
extern void DEBUG_EnableBreakpoint( int num, BOOL enable ); extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
extern void DEBUG_InfoBreakpoints(void); extern void DEBUG_InfoBreakpoints(void);
extern BOOL DEBUG_HandleTrap(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 void DEBUG_SuspendExecution( void );
extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count ); extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
extern BOOL DEBUG_IsFctReturn(void); extern BOOL DEBUG_IsFctReturn(void);
@ -362,7 +362,7 @@ extern void DEBUG_ExternalDebugger(void);
/* debugger/dbg.y */ /* debugger/dbg.y */
extern void DEBUG_Exit( DWORD exit_code ); 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! */ /* Choose your allocator! */
#if 1 #if 1