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

single step trap.
oldstable
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
* 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

View File

@ -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;

View File

@ -150,6 +150,7 @@ $gs { yylval.reg = REG_GS; return tREG; }
<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; }

View File

@ -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