dbgexec.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 593 行 · 第 1/2 页

C
593
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  Run program until the next debugger event.
*
****************************************************************************/


#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "dbgdefn.h"
#include "dbgreg.h"
#include "dbgtoken.h"
#include "dbgtoggl.h"
#include "dbginfo.h"
#include "dbgbreak.h"
#include "dbglit.h"
#include "dbginp.h"
#include "dbghook.h"
#include "dbgrep.h"
#include "trpcore.h"
#include "mad.h"
#include "dui.h"
#include "enterdb.h"


extern bool             AdvMachState( int );
extern bool             DispBPMsg( bool );
extern bool             InsertBPs( bool );
extern void             RemoveBPs( void );
extern bool             InsertWPs( void );
extern bool             UpdateWPs( void );
extern unsigned         CheckBPs( unsigned, unsigned );
extern void             Ring( void );
extern unsigned         MakeProgRun( bool );
extern void             DoSetWatchPnt( unsigned int, brk * );
extern bool             TBreak( void );
extern void             PopInpStack( void );
extern bool             PurgeInpStack( void );
extern void             ReadDbgRegs( void );
extern void             WriteDbgRegs( void );
extern void             SectTblRead( machine_state * );
extern address          GetRegIP( void );
extern bool             AddLibInfo( bool, bool * );
extern char             *StrCopy( char *, char * );
extern char             *Format( char *buff, char *fmt, ... );
extern unsigned         RemoteGetMsgText( char *, unsigned );
extern long             RemoteThawThread( dtid_t );
extern long             RemoteFreezeThread( dtid_t );
extern bool             SourceStep( void );
extern bool             SetUpTrace( bool );
extern void             CheckForNewThreads( bool );
extern void             CheckSegAlias( void );
extern void             SetMemBefore( bool );
extern void             SetMemAfter( bool );
extern void             SetCodeDot( address );
extern char             DlgFatal( void );
extern void             InvalidateTblCache( void );
extern bool             CheckStackPos( void );
extern void             RecordEvent( char *p );
extern void             RecordGo( char *p );
extern void             CheckEventRecorded( void );
extern char             *GetCmdName( int );
extern void             RecordAsynchEvent( void );
extern dtid_t           RemoteSetThread( dtid_t );
extern char             *GetLastImageName( void );
extern bool             DLLMatch( void );
extern void             DUIPlayDead( bool );
extern bool             TraceSimulate( void );
extern bool             TraceStart( bool );
extern mad_trace_how    TraceHow( bool force_into );
extern unsigned         TraceCheck( unsigned );
extern void             TraceStop( bool );
extern void             ReMapPoints( image_entry *);
extern void             DbgUpdate( update_list );
extern void             NameThread( dtid_t tid, char *name );
extern unsigned         ProgPoke( address, void *, unsigned );
extern bool             DlgScanDataAddr( char *str, address *value );
extern bool             DlgScanLong( char *str, long *value );
extern unsigned         NewCurrRadix( unsigned rad );
extern cmd_list         *AllocCmdList(char *,unsigned int );
extern void             FreeCmdList(cmd_list *);
extern void             PushCmdList(cmd_list *);
extern void             TypeInpStack(input_type);
extern char             *CnvNearestAddr( address, char *, unsigned );
extern void             PopInpStack( void );
extern void             ProcACmd( void );
extern bool             SymUserModLoad( char *fname, address *loadaddr );
extern bool             SymUserModUnload( char *fname );

extern input_stack      *InpStack;
extern machine_state    *DbgRegs;
extern tokens           CurrToken;
extern screen_state     ScrnState;
extern brk              DbgTmpBrk;
extern char             *TxtBuff;
extern thread_state     *HeadThd;
extern thread_state     *ExecThd;
static char             *MsgText;
extern brk              UserTmpBrk;

static int              InCall = 0;

static void NoCRLF( char *str )
/*****************************/
{
    char *p;

    for( p = str; *p != '\0'; ++p ) {
        if( *p == '\r' ) *p = ' ';
        if( *p == '\n' ) *p = ' ';
    }
}

void SetProgState( unsigned run_conditions )
{
    ReadDbgRegs();
    if( run_conditions & COND_THREAD_EXTRA ) {
        _SwitchOn( SW_THREAD_EXTRA_CHANGED );
    }
    if( run_conditions & COND_THREAD ) {
        DbgRegs->tid = RemoteSetThread( 0 );
        CheckForNewThreads( TRUE );
    }
    if( run_conditions & COND_ALIASING ) CheckSegAlias();
}

static void SetThreadStates( void )
{
    thread_state        *thd;

    for( thd = HeadThd; thd != NULL; thd = thd->link ) {
        if( thd->tid == DbgRegs->tid ) {
            RemoteThawThread( thd->tid );
        } else if( _IsOn( SW_EXECUTE_LONG ) && !SourceStep() ) {
            RemoteFreezeThread( thd->tid );
        } else {
            switch( thd->state ) {
            case THD_THAW:
                RemoteThawThread( thd->tid );
                break;
            case THD_FREEZE:
                RemoteFreezeThread( thd->tid );
                break;
            }
        }
    }
}

static void AddMessageText( char *str )
/*************************************/
{
    unsigned    len;

    if( MsgText == NULL ) {
        len = 0;
    } else {
        len = strlen( MsgText );
    }
    MsgText = DbgRealloc( MsgText, len + strlen( str ) + 1 );
    StrCopy( str, MsgText + len );
}

bool SetMsgText( char *message, unsigned *conditions )
/****************************************************/
{
    char        *equal,*comma1,*comma2;
    address     addr,buff_addr;
    long        buff_len,sym_len;
    long        num_returns;
    cmd_list    *cmds;

    if( memcmp( message, DEBUGGER_THREADID_COMMAND,
                sizeof( DEBUGGER_THREADID_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_THREADID_COMMAND )-1;
        equal = strchr( message, '=' );
        if( equal == NULL ) return( TRUE );
        *equal = '\0';
        CheckForNewThreads( FALSE );
        NoCRLF( equal+1 );
        NameThread( strtoul( message, NULL, 16 ), equal+1 );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_SETTRUE_COMMAND,
                sizeof( DEBUGGER_SETTRUE_COMMAND )-1 ) == 0 ) {
        unsigned old = NewCurrRadix( 16 );
        NoCRLF( message );
        if( DlgScanDataAddr( message + sizeof( DEBUGGER_SETTRUE_COMMAND )-1, &addr ) ) {
            ProgPoke( addr, "\x1", 1 );
        }
        NewCurrRadix( old );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_EXECUTE_COMMAND,
                sizeof( DEBUGGER_EXECUTE_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_EXECUTE_COMMAND )-1;
        NoCRLF( message );
        if( InCall == 0 ) {
            cmds = AllocCmdList( "go/keep", strlen( "go/keep" ) );
            PushCmdList( cmds );
            TypeInpStack( INP_HOOK );
            FreeCmdList( cmds );
        }
        cmds = AllocCmdList( message, strlen( message ) );
        PushCmdList( cmds );
        TypeInpStack( INP_HOOK );
        FreeCmdList( cmds );
        *conditions |= COND_STOP;
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_MESSAGE_COMMAND,
                sizeof( DEBUGGER_MESSAGE_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_MESSAGE_COMMAND )-1;
        NoCRLF( message );
        AddMessageText( message );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_LOOKUP_COMMAND,
                sizeof( DEBUGGER_LOOKUP_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_LOOKUP_COMMAND )-1;
        comma1 = strchr( message, ',' );
        if( comma1 == NULL ) return( TRUE );
        *comma1++ = '\0';
        comma2 = strchr( comma1, ',' );
        if( comma2 == NULL ) return( TRUE );
        *comma2++ = '\0';
        NoCRLF( comma2 );
        if( !DlgScanDataAddr( message, &addr ) ) return( TRUE );
        if( !DlgScanDataAddr( comma1, &buff_addr ) ) return( TRUE );
        if( !DlgScanLong( comma2, &buff_len ) ) return( TRUE );
        CnvNearestAddr( addr, TxtBuff, TXT_LEN );
        sym_len = strlen( TxtBuff )+1;
        if( sym_len > buff_len ) {
            TxtBuff[buff_len-1] = '\0';
            sym_len = buff_len;
        }
        ProgPoke( buff_addr, TxtBuff, sym_len );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_LOADMODULE_COMMAND,
                sizeof( DEBUGGER_LOADMODULE_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_LOADMODULE_COMMAND )-1;
        comma1 = strchr( message, ',' );
        if( comma1 == NULL )
            return( TRUE );
        *comma1++ = '\0';
        NoCRLF( comma1 );
        if( !DlgScanDataAddr( message, &addr ) )
            return( TRUE );
        SymUserModLoad( comma1, &addr );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_UNLOADMODULE_COMMAND,
                sizeof( DEBUGGER_UNLOADMODULE_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_UNLOADMODULE_COMMAND )-1;
        NoCRLF( message );
        SymUserModUnload( message );
        return( FALSE );
    } else if( memcmp( message, DEBUGGER_BREAKRETURN_COMMAND,
                sizeof( DEBUGGER_BREAKRETURN_COMMAND )-1 ) == 0 ) {
        message += sizeof( DEBUGGER_BREAKRETURN_COMMAND )-1;
        NoCRLF( message );
        if( !DlgScanLong( message, &num_returns ) )
            return( TRUE );
        // TODO: do something with num_returns value
        return( FALSE );
    } else {
        AddMessageText( message );
        return( TRUE );
    }
}

static bool RecordMsgText( unsigned *conditions )
{
    char        *p,*p2;
    unsigned    flags;
    bool        rc = FALSE;

    do {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?