mirror of
https://github.com/reactos/wine.git
synced 2024-11-24 20:30:01 +00:00
Now relying on exception codes to know when debugger is entered for a
single step trap.
This commit is contained in:
parent
cbb7a172f1
commit
ebd01a94aa
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user