mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 19:39:18 +02:00
DBG: improved startup; finding temp main break
git-svn-id: trunk@35042 -
This commit is contained in:
parent
b1dc06bfe7
commit
d082b36855
@ -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 }
|
||||||
|
Loading…
Reference in New Issue
Block a user