bool BreakWrite( address addr, mad_type_handle th, char *comment ) { brkp *bp; mad_type_info mti; bool ok_to_try = TRUE; if( th == MAD_NIL_TYPE_HANDLE ) return( FALSE ); MADTypeInfo( th, &mti ); switch( mti.b.bits / BITS_PER_BYTE ) { case 8: if( !Supports8ByteBreakpoints ) ok_to_try = FALSE; case 1: case 2: case 4: if( ok_to_try ) { if( FindBreak( addr ) != NULL ) { Error( ERR_NONE, LIT( ERR_POINT_EXISTS ) ); } bp = AddPoint( addr, th, FALSE ); if( bp == NULL ) return( TRUE ); bp->source_line = DupStr( comment ); RecordBreakEvent( bp, B_SET ); return( TRUE ); } default: return( FALSE ); } }
bool BreakWrite( address addr, mad_type_handle th, const char *comment ) { brkp *bp; mad_type_info mti; bool ok_to_try = true; if( IS_BP_EXECUTE( th ) ) return( false ); MADTypeInfo( th, &mti ); switch( mti.b.bits / BITS_PER_BYTE ) { case 8: if( !Is8ByteBreakpointsSupported() ) { ok_to_try = false; } // fall down case 1: case 2: case 4: if( ok_to_try ) { if( FindBreak( addr ) != NULL ) { Error( ERR_NONE, LIT_ENG( ERR_POINT_EXISTS ) ); } bp = AddPoint( addr, th, false ); if( bp == NULL ) return( true ); bp->source_line = DupStr( comment ); RecordBreakEvent( bp, B_SET ); return( true ); } // fall down default: return( false ); } }
static void DoActPoint( brkp *bp, bool act ) { bp->status.b.active = act; RecordBreakEvent( bp, act ? B_ACTIVATE : B_DEACTIVATE ); if( !act && !IS_BP_EXECUTE( bp->th ) ) { GetWPVal( bp ); } }
static void DoActPoint( brkp *bp, bool act ) { bp->status.b.active = act; RecordBreakEvent( bp, act ? B_ACTIVATE : B_DEACTIVATE ); if( act && bp->th != MAD_NIL_TYPE_HANDLE ) { GetWPVal( bp ); } }
brkp *AddBreak( address addr ) { brkp *bp; for( bp = BrkList; bp != NULL; bp = bp->next ) { if( AddrComp( bp->loc.addr, addr ) == 0 ) { DoActPoint( bp, true ); DbgUpdate( UP_BREAK_CHANGE ); return( bp ); } } bp = AddPoint( addr, BP_EXECUTE, false ); if( bp != NULL ) RecordBreakEvent( bp, B_SET ); return( bp ); }
extern brkp *AddBreak( address addr ) { brkp *bp; for( bp = BrkList; bp != NULL; bp = bp->next ) { if( AddrComp( bp->loc.addr, addr ) == 0 ) { DoActPoint( bp, TRUE ); DbgUpdate( UP_BREAK_CHANGE ); return( bp ); } } bp = AddPoint( addr, MAD_NIL_TYPE_HANDLE, FALSE ); if( bp == NULL ) return( NULL ); RecordBreakEvent( bp, B_SET ); return( bp ); }
void RemovePoint( brkp *bp ) { brkp **owner; for( owner = &BrkList; ; owner = &(*owner)->next ) { if( ( *owner ) == bp ) { RecordBreakEvent( bp, B_CLEAR ); FreeCmdList( bp->cmds ); _Free( bp->condition ); _Free( bp->source_line ); _Free( bp->image_name ); _Free( bp->mod_name ); _Free( bp->sym_name ); *owner = bp->next; DbgUpdate( UP_BREAK_CHANGE ); FiniMappableAddr( &bp->loc ); _Free( bp ); break; } } }
static void ResPoint( brkp *bp, bool res ) { bp->status.b.resume = res; RecordBreakEvent( bp, res ? B_RESUME : B_UNRESUME ); }
void RecordClearPoint( brkp *bp ) { SetRecord( true ); RecordBreakEvent( bp, B_CLEAR ); }
void RecordNewPoint( brkp *bp ) { SetRecord( true ); RecordBreakEvent( bp, B_SET ); }
static brkp *SetPoint( memory_expr def_seg, mad_type_handle th ) { brkp *bp; const char *start; size_t len; address loc; cmd_list *cmds; char *condition; long countdown; bool resume; bool active; int index; mad_type_info mti; unsigned old; bool unmapped; bool mapaddress; bool symaddress; char *image_name; char *mod_name; char *sym_name; long cue_diff; long addr_diff; int cmd; resume = false; index = 0; active = true; unmapped = false; mapaddress = false; symaddress = false; while( CurrToken == T_DIV ) { Scan(); cmd = ScanCmd( PointNameTab ); if( cmd < 0 ) break; switch( cmd ) { case B_RESUME: resume = true; break; case B_UNRESUME: resume = false; break; case B_ACTIVATE: active = true; break; case B_DEACTIVATE: active = false; break; case B_UNMAPPED: unmapped = true; break; case B_MAPADDRESS: mapaddress = true; ScanItem( true, &start, &len ); image_name = DupStrLen( start, len ); loc.mach.segment = ReqLongExpr(); loc.mach.offset = ReqLongExpr(); ReqComma(); break; case B_SYMADDRESS: symaddress = true; ScanItem( true, &start, &len ); image_name = DupStrLen( start, len ); ScanItem( true, &start, &len ); mod_name = DupStrLen( start, len ); ScanItem( true, &start, &len ); sym_name = DupStrLen( start, len ); cue_diff = ReqLongExpr(); addr_diff = ReqLongExpr(); loc = NilAddr; ReqComma(); break; case B_INDEX: old = NewCurrRadix( 10 ); index = ReqExpr(); NewCurrRadix( old ); ReqComma(); break; /* fall thru */ default: Error( ERR_LOC, LIT_ENG( ERR_BAD_OPTION ), GetCmdName( CMD_BREAK ) ); break; } } if( !unmapped ) { ReqMemAddr( def_seg, &loc ); } for( bp = BrkList; bp != NULL; bp = bp->next ) { if( AddrComp( bp->loc.addr, loc ) == 0 ) { Error( ERR_NONE, LIT_ENG( ERR_POINT_EXISTS ) ); } } cmds = NULL; condition = NULL; countdown = 0; if( ScanQuote( &start, &len ) ) { if( len != 0 ) cmds = AllocCmdList( start, len ); if( ScanQuote( &start, &len ) ) { if( len != 0 ) condition = DupStrLen( start, len ); if( !ScanEOC() ) { countdown = ReqExpr(); } } } ReqEOC(); if( !IS_BP_EXECUTE( th ) ) { MADTypeInfo( th, &mti ); switch( mti.b.bits / BITS_PER_BYTE ) { case 1: case 2: case 4: break; case 8: if( Is8ByteBreakpointsSupported() ) break; default: Error( ERR_NONE, LIT_ENG( ERR_NOT_WATCH_SIZE ) ); break; } } bp = AddPoint( loc, th, unmapped ); if( bp == NULL ) return( NULL ); bp->status.b.unmapped = unmapped; if( mapaddress ) { bp->loc.image_name = image_name; } if( symaddress ) { bp->image_name = image_name; bp->mod_name = mod_name; bp->sym_name = sym_name; bp->cue_diff = cue_diff; bp->addr_diff = addr_diff; } bp->cmds = cmds; if( cmds != NULL ) bp->status.b.use_cmds = true; bp->condition = condition; if( condition != NULL ) bp->status.b.use_condition = true; SetBPCountDown( bp, countdown ); bp->status.b.resume = resume; bp->status.b.active = active; if( index != 0 ) bp->index = index; RecordBreakEvent( bp, B_SET ); return( bp ); }