mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-25 13:37:21 +01:00
FpDebug: Move break-setting error flag from Handler to Map
This commit is contained in:
parent
d58113e2e0
commit
6d6f77a870
@ -425,6 +425,7 @@ type
|
|||||||
TFpBreakPointMapEntry = record
|
TFpBreakPointMapEntry = record
|
||||||
InternalBreakPoint: Pointer; // TFpInternalBreakpoint or TFpInternalBreakpointArray
|
InternalBreakPoint: Pointer; // TFpInternalBreakpoint or TFpInternalBreakpointArray
|
||||||
IsBreakList: ByteBool;
|
IsBreakList: ByteBool;
|
||||||
|
ErrorSetting: ByteBool;
|
||||||
TargetHandlerData: TFpBreakPointTargetHandlerData; // must be last
|
TargetHandlerData: TFpBreakPointTargetHandlerData; // must be last
|
||||||
end;
|
end;
|
||||||
PFpBreakPointMapEntry = ^TFpBreakPointMapEntry;
|
PFpBreakPointMapEntry = ^TFpBreakPointMapEntry;
|
||||||
@ -486,7 +487,7 @@ type
|
|||||||
constructor Create(AProcess: TDbgProcess);
|
constructor Create(AProcess: TDbgProcess);
|
||||||
function GetDataSize: integer; virtual; abstract;
|
function GetDataSize: integer; virtual; abstract;
|
||||||
|
|
||||||
procedure InsertBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); virtual; abstract;
|
function InsertBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer): boolean; virtual; abstract;
|
||||||
procedure RemoveBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); virtual; abstract;
|
procedure RemoveBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); virtual; abstract;
|
||||||
|
|
||||||
// When the debugger modifies the debuggee's code, it might be that the
|
// When the debugger modifies the debuggee's code, it might be that the
|
||||||
@ -510,7 +511,6 @@ type
|
|||||||
{ TInternalBreakLocationEntry }
|
{ TInternalBreakLocationEntry }
|
||||||
TInternalBreakLocationEntry = packed record
|
TInternalBreakLocationEntry = packed record
|
||||||
OrigValue: _BRK_STORE;
|
OrigValue: _BRK_STORE;
|
||||||
ErrorSetting: ByteBool;
|
|
||||||
end;
|
end;
|
||||||
PInternalBreakLocationEntry = ^TInternalBreakLocationEntry;
|
PInternalBreakLocationEntry = ^TInternalBreakLocationEntry;
|
||||||
P_BRK_STORE = ^_BRK_STORE;
|
P_BRK_STORE = ^_BRK_STORE;
|
||||||
@ -529,7 +529,7 @@ type
|
|||||||
public
|
public
|
||||||
function GetDataSize: integer; override;
|
function GetDataSize: integer; override;
|
||||||
|
|
||||||
procedure InsertBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); override;
|
function InsertBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer): boolean; override;
|
||||||
procedure RemoveBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); override;
|
procedure RemoveBreakInstructionCode(const ALocation: TDBGPtr; const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer); override;
|
||||||
|
|
||||||
// When the debugger modifies the debuggee's code, it might be that the
|
// When the debugger modifies the debuggee's code, it might be that the
|
||||||
@ -1452,7 +1452,7 @@ begin
|
|||||||
FTmpDataPtr^.InternalBreakPoint := AInternalBreak;
|
FTmpDataPtr^.InternalBreakPoint := AInternalBreak;
|
||||||
|
|
||||||
FProcess.DoBeforeBreakLocationMapChange; // Only if a new breakpoint is set => memory changed
|
FProcess.DoBeforeBreakLocationMapChange; // Only if a new breakpoint is set => memory changed
|
||||||
TargetHandler.InsertBreakInstructionCode(ALocation, AInternalBreak, @FTmpDataPtr^.TargetHandlerData);
|
MapEntryPtr^.ErrorSetting := not TargetHandler.InsertBreakInstructionCode(ALocation, AInternalBreak, @FTmpDataPtr^.TargetHandlerData);
|
||||||
|
|
||||||
Add(ALocation, FTmpDataPtr^);
|
Add(ALocation, FTmpDataPtr^);
|
||||||
end;
|
end;
|
||||||
@ -1496,6 +1496,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
FProcess.DoBeforeBreakLocationMapChange; // Only if a breakpoint is removed => memory changed
|
FProcess.DoBeforeBreakLocationMapChange; // Only if a breakpoint is removed => memory changed
|
||||||
|
if not MapEntryPtr^.ErrorSetting then
|
||||||
TargetHandler.RemoveBreakInstructionCode(ALocation, AInternalBreak, @MapEntryPtr^.TargetHandlerData);
|
TargetHandler.RemoveBreakInstructionCode(ALocation, AInternalBreak, @MapEntryPtr^.TargetHandlerData);
|
||||||
Delete(ALocation);
|
Delete(ALocation);
|
||||||
end;
|
end;
|
||||||
@ -1653,7 +1654,8 @@ begin
|
|||||||
// Does break instruction fall completely outside AData
|
// Does break instruction fall completely outside AData
|
||||||
if (MapEnumData.Location + SizeOf(_BRK_STORE) <= AAdress) or
|
if (MapEnumData.Location + SizeOf(_BRK_STORE) <= AAdress) or
|
||||||
(MapEnumData.Location >= (AAdress + ASize)) or
|
(MapEnumData.Location >= (AAdress + ASize)) or
|
||||||
HPtr(MapEnumData.TargetHandlerDataPtr)^.ErrorSetting then
|
(MapEnumData.MapDataPtr^.ErrorSetting)
|
||||||
|
then
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (MapEnumData.Location >= AAdress) and (MapEnumData.Location + SizeOf(_BRK_STORE) <= (AAdress + ASize)) then begin
|
if (MapEnumData.Location >= AAdress) and (MapEnumData.Location + SizeOf(_BRK_STORE) <= (AAdress + ASize)) then begin
|
||||||
@ -1743,13 +1745,15 @@ begin
|
|||||||
Result := PInternalBreakLocationEntry(Src);
|
Result := PInternalBreakLocationEntry(Src);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGenericBreakPointTargetHandler.InsertBreakInstructionCode(const ALocation: TDBGPtr;
|
function TGenericBreakPointTargetHandler.InsertBreakInstructionCode(const ALocation: TDBGPtr;
|
||||||
const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer);
|
const AInternalBreak: TFpInternalBreakpoint; AnEntry: PFpBreakPointTargetHandlerDataPointer
|
||||||
|
): boolean;
|
||||||
var
|
var
|
||||||
LocData: PInternalBreakLocationEntry absolute AnEntry;
|
LocData: PInternalBreakLocationEntry absolute AnEntry;
|
||||||
IsTempRemoved: Boolean;
|
IsTempRemoved: Boolean;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
|
Result := False;
|
||||||
IsTempRemoved := False;
|
IsTempRemoved := False;
|
||||||
for i := 0 to high(FTmpRemovedBreaks) do begin
|
for i := 0 to high(FTmpRemovedBreaks) do begin
|
||||||
IsTempRemoved := ALocation = FTmpRemovedBreaks[i];
|
IsTempRemoved := ALocation = FTmpRemovedBreaks[i];
|
||||||
@ -1757,7 +1761,7 @@ begin
|
|||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
LocData^.ErrorSetting := not DoInsertBreakInstructionCode(ALocation, LocData^.OrigValue, IsTempRemoved);
|
Result := DoInsertBreakInstructionCode(ALocation, LocData^.OrigValue, IsTempRemoved);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGenericBreakPointTargetHandler.RemoveBreakInstructionCode(const ALocation: TDBGPtr;
|
procedure TGenericBreakPointTargetHandler.RemoveBreakInstructionCode(const ALocation: TDBGPtr;
|
||||||
@ -1765,7 +1769,6 @@ procedure TGenericBreakPointTargetHandler.RemoveBreakInstructionCode(const ALoca
|
|||||||
var
|
var
|
||||||
LocData: PInternalBreakLocationEntry absolute AnEntry;
|
LocData: PInternalBreakLocationEntry absolute AnEntry;
|
||||||
begin
|
begin
|
||||||
if not LocData^.ErrorSetting then
|
|
||||||
DoRemoveBreakInstructionCode(ALocation, LocData^.OrigValue);
|
DoRemoveBreakInstructionCode(ALocation, LocData^.OrigValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user