DBG: improved startup; finding temp main break

git-svn-id: trunk@35042 -
This commit is contained in:
martin 2012-01-30 19:02:13 +00:00
parent b1dc06bfe7
commit d082b36855

View File

@ -313,38 +313,45 @@ type
TGDBMIInternalBreakPoint = class TGDBMIInternalBreakPoint = class
private private
FLineOffsFunction: string;
// -break-insert name // -break-insert name
FBreakID: Integer; FNameBreakID: Integer;
FBreakAddr: TDBGPtr; FNameBreakAddr: TDBGPtr;
// -break-insert *addr // -break-insert *addr
FInfoID: Integer; FAddrBreakID: Integer;
FInfoAddr: TDBGPtr; FAddrBreakAddr: TDBGPtr;
// -break-insert *custom
FCustomID: Integer; FCustomID: Integer;
FCustomAddr: TDBGPtr; FCustomAddr: TDBGPtr;
FAddOffsID: Integer; // -break-insert +x
FAddOffsAddr: TDBGPtr; FLineOffsID: Integer;
FLineOffsAddr: TDBGPtr;
FMainAddrFound: TDBGPtr; FMainAddrFound: TDBGPtr;
FName: string; FName: string;
procedure ClearBreak(ACmd: TGDBMIDebuggerCommand); procedure ClearName(ACmd: TGDBMIDebuggerCommand);
procedure ClearInfo(ACmd: TGDBMIDebuggerCommand); procedure ClearAddr(ACmd: TGDBMIDebuggerCommand); // Main-Addr
procedure ClearCustom(ACmd: TGDBMIDebuggerCommand); procedure ClearCustom(ACmd: TGDBMIDebuggerCommand);
procedure ClearAddOffs(ACmd: TGDBMIDebuggerCommand); procedure ClearLineOffs(ACmd: TGDBMIDebuggerCommand);
function BreakSet(ACmd: TGDBMIDebuggerCommand; ALoc: String; out AId: integer; out AnAddr: TDBGPtr): Boolean; function BreakSet(ACmd: TGDBMIDebuggerCommand; ALoc: String; out AId: integer;
function GetAddr(ACmd: TGDBMIDebuggerCommand): TDBGPtr; out AnAddr: TDBGPtr): Boolean;
function BreakSet(ACmd: TGDBMIDebuggerCommand; ALoc: String; out AId: integer;
out AnAddr: TDBGPtr; out AFuncName: string): Boolean;
function GetInfoAddr(ACmd: TGDBMIDebuggerCommand): TDBGPtr;
procedure InternalSetAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr); procedure InternalSetAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr);
public public
constructor Create(AName: string); constructor Create(AName: string);
procedure SetBoth(ACmd: TGDBMIDebuggerCommand); procedure SetBoth(ACmd: TGDBMIDebuggerCommand);
procedure SetNamed(ACmd: TGDBMIDebuggerCommand); procedure SetByName(ACmd: TGDBMIDebuggerCommand);
procedure SetAddr(ACmd: TGDBMIDebuggerCommand; SetNamedOnFail: Boolean = False); procedure SetByAddr(ACmd: TGDBMIDebuggerCommand; SetNamedOnFail: Boolean = False);
procedure SetAtCustomAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr); procedure SetAtCustomAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr);
procedure SetAddOffs(ACmd: TGDBMIDebuggerCommand; AnOffset: integer); procedure SetAtLineOffs(ACmd: TGDBMIDebuggerCommand; AnOffset: integer);
procedure Clear(ACmd: TGDBMIDebuggerCommand); procedure Clear(ACmd: TGDBMIDebuggerCommand);
procedure ClearId(ACmd: TGDBMIDebuggerCommand; AnId: Integer); function ClearId(ACmd: TGDBMIDebuggerCommand; AnId: Integer): Boolean;
function MatchAddr(AnAddr: TDBGPtr): boolean; function MatchAddr(AnAddr: TDBGPtr): boolean;
function MatchId(AnId: Integer): boolean; function MatchId(AnId: Integer): boolean;
function Enabled: boolean; function Enabled: boolean;
property MainAddrFound: TDBGPtr read FMainAddrFound; property MainAddrFound: TDBGPtr read FMainAddrFound;
property LineOffsFunction: string read FLineOffsFunction;
end; end;
{ TGDBMIDebugger } { TGDBMIDebugger }
@ -1713,6 +1720,7 @@ var
i, i2, j: Integer; i, i2, j: Integer;
begin begin
Result := False; Result := False;
AnId := -1;
i := pos(BreaKErrMsg, AText); i := pos(BreaKErrMsg, AText);
if i > 0 if i > 0
@ -1729,7 +1737,7 @@ begin
i2 := j; i2 := j;
while (i2 <= length(AText)) and (AText[i2] in ['0'..'9']) do inc(i2); while (i2 <= length(AText)) and (AText[i2] in ['0'..'9']) do inc(i2);
if i2 > j then if i2 > j then
AnId := StrToIntDef(copy(AText, j, i2-1), -1); AnId := StrToIntDef(copy(AText, j, i2-j), -1);
Delete(AText, i, i2 - i); Delete(AText, i, i2 - i);
Result := True; Result := True;
@ -4056,15 +4064,14 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
begin begin
RunToMainState := ANextState; RunToMainState := ANextState;
case AType of case AType of
mtMain: FTheDebugger.FMainAddrBreak.SetNamed(Self); mtMain: FTheDebugger.FMainAddrBreak.SetByName(Self);
mtMainAddr: FTheDebugger.FMainAddrBreak.SetAddr(Self); mtMainAddr: FTheDebugger.FMainAddrBreak.SetByAddr(Self);
mtEntry: FTheDebugger.FMainAddrBreak.SetAtCustomAddr(Self, StrToQWordDef(EntryPoint, 0)); mtEntry: FTheDebugger.FMainAddrBreak.SetAtCustomAddr(Self, StrToQWordDef(EntryPoint, 0));
mtAddZero: FTheDebugger.FMainAddrBreak.SetAddOffs(Self, 0); mtAddZero: FTheDebugger.FMainAddrBreak.SetAtLineOffs(Self, 0);
end; end;
Result := FTheDebugger.FMainAddrBreak.Enabled; Result := FTheDebugger.FMainAddrBreak.Enabled;
end; end;
begin begin
FTheDebugger.FMainAddrBreak.Clear(Self);
case RunToMainState of case RunToMainState of
msMainAddr: begin msMainAddr: begin
if TrySetMainBrk(mtMainAddr, msTryZero) then exit; if TrySetMainBrk(mtMainAddr, msTryZero) then exit;
@ -4085,14 +4092,18 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
end; end;
msDefault: begin msDefault: begin
TrySetMainBrk(mtAddZero, msNone); // always include +0 TrySetMainBrk(mtAddZero, msNone); // always include +0
if (FTheDebugger.FMainAddrBreak.LineOffsFunction <> 'main')
//and (FTheDebugger.FMainAddrBreak.LineOffsFunction <> '_FPC_MAINCRTSTARTUP')
then
TrySetMainBrk(mtMain, msNone); // include name
if TrySetMainBrk(mtEntry, msTryNameZero) then exit; if TrySetMainBrk(mtEntry, msTryNameZero) then exit;
if TrySetMainBrk(mtMainAddr, msTryZero) then exit; if TrySetMainBrk(mtMainAddr, msTryZero) then exit;
//if TrySetMainBrk(mtAddZero, msNone) then exit;
end; end;
msTryNameZero: begin msTryNameZero: begin
TrySetMainBrk(mtAddZero, msNone); // always include +0 if (FTheDebugger.FMainAddrBreak.LineOffsFunction <> 'main')
then
TrySetMainBrk(mtAddZero, msNone); // include +0, if not at main
if TrySetMainBrk(mtMain, msTryZero) then exit; if TrySetMainBrk(mtMain, msTryZero) then exit;
//if TrySetMainBrk(mtAddZero, msNone) then exit;
end; end;
msTryZero: begin msTryZero: begin
if TrySetMainBrk(mtAddZero, msNone) then exit; if TrySetMainBrk(mtAddZero, msNone) then exit;
@ -4104,6 +4115,8 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
msTryName: begin msTryName: begin
if TrySetMainBrk(mtMain, msNone) then exit; if TrySetMainBrk(mtMain, msNone) then exit;
end; end;
msNone:
FTheDebugger.FMainAddrBreak.Clear(Self);
end; end;
end; end;
@ -4112,6 +4125,7 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
Cmd, s, s2, rval: String; Cmd, s, s2, rval: String;
i: integer; i: integer;
List: TGDBMINameValueList; List: TGDBMINameValueList;
BrkErr: Boolean;
begin begin
Result := 0; // Target PID Result := 0; // Target PID
RunToMainState := msEntryPoint; RunToMainState := msEntryPoint;
@ -4126,6 +4140,7 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
Cmd := '-exec-run'; Cmd := '-exec-run';
rval := ''; rval := '';
FTheDebugger.FMainAddrBreak.Clear(Self);
while true do begin while true do begin
SetMainBrk; SetMainBrk;
if not FTheDebugger.FMainAddrBreak.Enabled if not FTheDebugger.FMainAddrBreak.Enabled
@ -4150,10 +4165,19 @@ function TGDBMIDebuggerCommandStartDebugging.DoExecute: Boolean;
rval := rval + s; rval := rval + s;
if not ParseBreakInsertError(s, i) BrkErr := ParseBreakInsertError(s, i);
if not BrkErr
then break; then break;
// Todo, clear individual breakpoints, if many were set while BrkErr do begin
if FTheDebugger.FMainAddrBreak.ClearId(Self, i) then
BrkErr := ParseBreakInsertError(s, i)
else begin
FTheDebugger.FMainAddrBreak.Clear(Self);
BrkErr := False;
end;
end;
end; end;
if R.State <> dsRun if R.State <> dsRun
@ -4394,9 +4418,9 @@ begin
DebugLn('[Debugger] Target PID: %u', [TargetInfo^.TargetPID]); DebugLn('[Debugger] Target PID: %u', [TargetInfo^.TargetPID]);
// they may still exist from prev run, addr will be checked // they may still exist from prev run, addr will be checked
FTheDebugger.FExceptionBreak.SetAddr(Self); FTheDebugger.FExceptionBreak.SetByAddr(Self);
FTheDebugger.FBreakErrorBreak.SetAddr(Self); FTheDebugger.FBreakErrorBreak.SetByAddr(Self);
FTheDebugger.FRunErrorBreak.SetAddr(Self); FTheDebugger.FRunErrorBreak.SetByAddr(Self);
//if R.State = dsNone //if R.State = dsNone
//then begin //then begin
@ -10839,20 +10863,21 @@ end;
{ TGDBMIInternalBreakPoint } { TGDBMIInternalBreakPoint }
procedure TGDBMIInternalBreakPoint.ClearBreak(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.ClearName(ACmd: TGDBMIDebuggerCommand);
begin begin
if FBreakID = -1 then exit; if FNameBreakID = -1 then exit;
ACmd.ExecuteCommand('-break-delete %d', [FBreakID], [cfCheckError]); ACmd.ExecuteCommand('-break-delete %d', [FNameBreakID], [cfCheckError]);
FBreakID := -1; FNameBreakID := -1;
FBreakAddr := 0; FNameBreakAddr := 0;
end; end;
procedure TGDBMIInternalBreakPoint.ClearInfo(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.ClearAddr(ACmd: TGDBMIDebuggerCommand);
begin begin
if FInfoID = -1 then exit; if FAddrBreakID = -1 then exit;
ACmd.ExecuteCommand('-break-delete %d', [FInfoID], [cfCheckError]); ACmd.ExecuteCommand('-break-delete %d', [FAddrBreakID], [cfCheckError]);
FInfoID := -1; FAddrBreakID := -1;
FInfoAddr := 0; FAddrBreakAddr := 0;
FMainAddrFound := 0;
end; end;
procedure TGDBMIInternalBreakPoint.ClearCustom(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.ClearCustom(ACmd: TGDBMIDebuggerCommand);
@ -10863,33 +10888,44 @@ begin
FCustomAddr := 0; FCustomAddr := 0;
end; end;
procedure TGDBMIInternalBreakPoint.ClearAddOffs(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.ClearLineOffs(ACmd: TGDBMIDebuggerCommand);
begin begin
if FAddOffsID = -1 then exit; if FLineOffsID = -1 then exit;
ACmd.ExecuteCommand('-break-delete %d', [FAddOffsID], [cfCheckError]); ACmd.ExecuteCommand('-break-delete %d', [FLineOffsID], [cfCheckError]);
FAddOffsID := -1; FLineOffsID := -1;
FAddOffsAddr := 0; FLineOffsAddr := 0;
FLineOffsFunction := '';
end; end;
function TGDBMIInternalBreakPoint.BreakSet(ACmd: TGDBMIDebuggerCommand; function TGDBMIInternalBreakPoint.BreakSet(ACmd: TGDBMIDebuggerCommand;
ALoc: String; out AId: integer; out AnAddr: TDBGPtr): boolean; ALoc: String; out AId: integer; out AnAddr: TDBGPtr): boolean;
var
FuncName: string;
begin
BreakSet(ACmd, ALoc, AId, AnAddr, FuncName);
end;
function TGDBMIInternalBreakPoint.BreakSet(ACmd: TGDBMIDebuggerCommand; ALoc: String; out
AId: integer; out AnAddr: TDBGPtr; out AFuncName: string): Boolean;
var var
R: TGDBMIExecResult; R: TGDBMIExecResult;
ResultList: TGDBMINameValueList; ResultList: TGDBMINameValueList;
begin begin
AId := -1; AId := -1;
AnAddr := 0; AnAddr := 0;
AFuncName := '';
ACmd.ExecuteCommand('-break-insert %s', [ALoc], R); ACmd.ExecuteCommand('-break-insert %s', [ALoc], R);
Result := R.State <> dsError; Result := R.State <> dsError;
if not Result then exit; if not Result then exit;
ResultList := TGDBMINameValueList.Create(R, ['bkpt']); ResultList := TGDBMINameValueList.Create(R, ['bkpt']);
AId := StrToIntDef(ResultList.Values['number'], -1); AId := StrToIntDef(ResultList.Values['number'], -1);
AnAddr := StrToQWordDef(ResultList.Values['addr'], 0); AnAddr := StrToQWordDef(ResultList.Values['addr'], 0);
AFuncName := ResultList.Values['func'];
ResultList.Free; ResultList.Free;
end; end;
function TGDBMIInternalBreakPoint.GetAddr(ACmd: TGDBMIDebuggerCommand): TDBGPtr; function TGDBMIInternalBreakPoint.GetInfoAddr(ACmd: TGDBMIDebuggerCommand): TDBGPtr;
var var
R: TGDBMIExecResult; R: TGDBMIExecResult;
S: String; S: String;
@ -10907,33 +10943,33 @@ end;
procedure TGDBMIInternalBreakPoint.InternalSetAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr); procedure TGDBMIInternalBreakPoint.InternalSetAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr);
begin begin
if (AnAddr <> FInfoAddr) then if (AnAddr <> FAddrBreakAddr) then
ClearInfo(ACmd); ClearAddr(ACmd);
if (AnAddr = 0) or (AnAddr = FInfoAddr) or if (AnAddr = 0) or (AnAddr = FAddrBreakAddr) or
(AnAddr = FCustomAddr) or (AnAddr = FAddOffsAddr) (AnAddr = FCustomAddr) or (AnAddr = FLineOffsAddr)
then exit; then exit;
if (FCustomID >= 0) and (AnAddr = FCustomAddr) then begin if (FCustomID >= 0) and (AnAddr = FCustomAddr) then begin
FInfoID := FCustomID; FAddrBreakID := FCustomID;
FInfoAddr := FCustomAddr; FAddrBreakAddr := FCustomAddr;
FCustomID := -1; FCustomID := -1;
FCustomAddr := 0; FCustomAddr := 0;
end end
else else
BreakSet(ACmd, Format('*%u', [AnAddr]), FInfoID, FInfoAddr); BreakSet(ACmd, Format('*%u', [AnAddr]), FAddrBreakID, FAddrBreakAddr);
end; end;
constructor TGDBMIInternalBreakPoint.Create(AName: string); constructor TGDBMIInternalBreakPoint.Create(AName: string);
begin begin
FBreakID := -1; FNameBreakID := -1;
FBreakAddr := 0; FNameBreakAddr := 0;
FInfoID := -1; FAddrBreakID := -1;
FInfoAddr := 0; FAddrBreakAddr := 0;
FCustomID := -1; FCustomID := -1;
FCustomAddr := 0; FCustomAddr := 0;
FAddOffsID := -1; FLineOffsID := -1;
FAddOffsAddr := 0; FLineOffsAddr := 0;
FName := AName; FName := AName;
end; end;
@ -10953,37 +10989,37 @@ begin
if ACmd.DebuggerState = dsError then Exit; if ACmd.DebuggerState = dsError then Exit;
// keep if already set // keep if already set
if FBreakID < 0 then if FNameBreakID < 0 then
if not BreakSet(ACmd, FName, FBreakID, FBreakAddr) then exit; if not BreakSet(ACmd, FName, FNameBreakID, FNameBreakAddr) then exit;
// Try to retrieve the address of the procedure // Try to retrieve the address of the procedure
A := GetAddr(ACmd); A := GetInfoAddr(ACmd);
if A = 0 then exit; if A = 0 then exit;
if (A <> FBreakAddr) then if (A <> FNameBreakAddr) then
InternalSetAddr(ACmd, A); InternalSetAddr(ACmd, A);
end; end;
procedure TGDBMIInternalBreakPoint.SetNamed(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.SetByName(ACmd: TGDBMIDebuggerCommand);
begin begin
if FBreakID < 0 then if FNameBreakID < 0 then
if not BreakSet(ACmd, FName, FBreakID, FBreakAddr) then exit; if not BreakSet(ACmd, FName, FNameBreakID, FNameBreakAddr) then exit;
// keep others // keep others
end; end;
procedure TGDBMIInternalBreakPoint.SetAddr(ACmd: TGDBMIDebuggerCommand; SetNamedOnFail: Boolean = False); procedure TGDBMIInternalBreakPoint.SetByAddr(ACmd: TGDBMIDebuggerCommand; SetNamedOnFail: Boolean = False);
var var
A: TDBGPtr; A: TDBGPtr;
begin begin
if ACmd.DebuggerState = dsError then Exit; if ACmd.DebuggerState = dsError then Exit;
A := GetAddr(ACmd); A := GetInfoAddr(ACmd);
InternalSetAddr(ACmd, A); InternalSetAddr(ACmd, A);
if (A <> 0) and (A = FInfoAddr) then if (A <> 0) and (A = FAddrBreakAddr) then
ClearBreak(ACmd); ClearName(ACmd);
If SetNamedOnFail and (A = 0) and (FBreakID < 0) then If SetNamedOnFail and (A = 0) and (FNameBreakID < 0) then
BreakSet(ACmd, FName, FBreakID, FBreakAddr); BreakSet(ACmd, FName, FNameBreakID, FNameBreakAddr);
end; end;
procedure TGDBMIInternalBreakPoint.SetAtCustomAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr); procedure TGDBMIInternalBreakPoint.SetAtCustomAddr(ACmd: TGDBMIDebuggerCommand; AnAddr: TDBGPtr);
@ -10992,58 +11028,63 @@ begin
ClearCustom(ACmd); ClearCustom(ACmd);
if (AnAddr <> 0) and if (AnAddr <> 0) and
((FInfoID < 0) or (AnAddr <> FInfoAddr)) and ((FAddrBreakID < 0) or (AnAddr <> FAddrBreakAddr)) and
((FAddOffsID < 0) or (AnAddr <> FAddOffsAddr)) and ((FLineOffsID < 0) or (AnAddr <> FLineOffsAddr)) and
((FBreakID < 0) or (AnAddr <> FBreakAddr)) ((FNameBreakID < 0) or (AnAddr <> FNameBreakAddr))
then then
BreakSet(ACmd, Format('*%u', [AnAddr]), FCustomID, FCustomAddr); BreakSet(ACmd, Format('*%u', [AnAddr]), FCustomID, FCustomAddr);
end; end;
procedure TGDBMIInternalBreakPoint.SetAddOffs(ACmd: TGDBMIDebuggerCommand; AnOffset: integer); procedure TGDBMIInternalBreakPoint.SetAtLineOffs(ACmd: TGDBMIDebuggerCommand; AnOffset: integer);
begin begin
if ACmd.DebuggerState = dsError then Exit; if ACmd.DebuggerState = dsError then Exit;
ClearAddOffs(ACmd); ClearLineOffs(ACmd);
if AnOffset < 0 then if AnOffset < 0 then
BreakSet(ACmd, Format('%d', [AnOffset]), FAddOffsID, FAddOffsAddr) BreakSet(ACmd, Format('%d', [AnOffset]), FLineOffsID, FLineOffsAddr, FLineOffsFunction)
else else
BreakSet(ACmd, Format('+%d', [AnOffset]), FAddOffsID, FAddOffsAddr); BreakSet(ACmd, Format('+%d', [AnOffset]), FLineOffsID, FLineOffsAddr, FLineOffsFunction);
end; end;
procedure TGDBMIInternalBreakPoint.Clear(ACmd: TGDBMIDebuggerCommand); procedure TGDBMIInternalBreakPoint.Clear(ACmd: TGDBMIDebuggerCommand);
begin begin
if ACmd.DebuggerState = dsError then Exit; if ACmd.DebuggerState = dsError then Exit;
ClearBreak(ACmd); ClearName(ACmd);
ClearInfo(ACmd); ClearAddr(ACmd);
ClearCustom(ACmd); ClearCustom(ACmd);
ClearAddOffs(ACmd); ClearLineOffs(ACmd);
end; end;
procedure TGDBMIInternalBreakPoint.ClearId(ACmd: TGDBMIDebuggerCommand; AnId: Integer); function TGDBMIInternalBreakPoint.ClearId(ACmd: TGDBMIDebuggerCommand; AnId: Integer): Boolean;
begin begin
if (AnId = FBreakID) then ClearBreak(ACmd); Result := (AnId > 0) and
if (AnId = FInfoID) then ClearInfo(ACmd); ( (AnId = FNameBreakID) or (AnId = FAddrBreakID) or
if (AnId = FCustomID) then ClearCustom(ACmd); (AnId = FCustomID) or (AnId = FLineOffsID) );
if (AnId = FAddOffsID) then ClearAddOffs(ACmd); if not Result then exit;
if (AnId = FNameBreakID) then ClearName(ACmd);
if (AnId = FAddrBreakID) then ClearAddr(ACmd);
if (AnId = FCustomID) then ClearCustom(ACmd);
if (AnId = FLineOffsID) then ClearLineOffs(ACmd);
end; end;
function TGDBMIInternalBreakPoint.MatchAddr(AnAddr: TDBGPtr): boolean; function TGDBMIInternalBreakPoint.MatchAddr(AnAddr: TDBGPtr): boolean;
begin begin
Result := (AnAddr <> 0) and Result := (AnAddr <> 0) and
( (AnAddr = FBreakAddr) or (AnAddr = FInfoAddr) or ( (AnAddr = FNameBreakAddr) or (AnAddr = FAddrBreakAddr) or
(AnAddr = FCustomAddr) or (AnAddr = FAddOffsAddr)); (AnAddr = FCustomAddr) or (AnAddr = FLineOffsAddr));
end; end;
function TGDBMIInternalBreakPoint.MatchId(AnId: Integer): boolean; function TGDBMIInternalBreakPoint.MatchId(AnId: Integer): boolean;
begin begin
Result := (AnId >= 0) and Result := (AnId >= 0) and
( (AnId = FBreakID) or (AnId = FInfoID) or ( (AnId = FNameBreakID) or (AnId = FAddrBreakID) or
(AnId = FCustomID) or (AnId = FAddOffsID)); (AnId = FCustomID) or (AnId = FLineOffsID));
end; end;
function TGDBMIInternalBreakPoint.Enabled: boolean; function TGDBMIInternalBreakPoint.Enabled: boolean;
begin begin
Result := (FBreakID >= 0) or (FInfoID >= 0) or (FCustomID > 0) or (FAddOffsID > 0); Result := (FNameBreakID >= 0) or (FAddrBreakID >= 0) or (FCustomID > 0) or (FLineOffsID > 0);
end; end;
{ TGDBMIDebuggerSimpleCommand } { TGDBMIDebuggerSimpleCommand }