mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-02 00:20:24 +02:00
LazDebuggerFp (pure): Hide software breakpoints (int3) on reading data
git-svn-id: trunk@44704 -
This commit is contained in:
parent
0e62389d08
commit
8f5701ed19
@ -208,6 +208,7 @@ type
|
||||
procedure SetExitCode(AValue: DWord);
|
||||
function GetLastEventProcessIdentifier: THandle; virtual;
|
||||
function DoBreak(BreakpointAddress: TDBGPtr; AThreadID: integer): Boolean;
|
||||
procedure MaskBreakpointsInReadData(const AAdress: TDbgPtr; const ASize: Cardinal; var AData);
|
||||
public
|
||||
class function StartInstance(AFileName: string; AParams: string): TDbgProcess; virtual;
|
||||
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); virtual;
|
||||
@ -699,6 +700,29 @@ begin
|
||||
then FCurrentBreakpoint := nil; // no need for a singlestep if we continue
|
||||
end;
|
||||
|
||||
procedure TDbgProcess.MaskBreakpointsInReadData(const AAdress: TDbgPtr; const ASize: Cardinal; var AData);
|
||||
var
|
||||
BreakLocation: TDBGPtr;
|
||||
Bp: TDbgBreakpoint;
|
||||
DataArr: PByteArray;
|
||||
Iterator: TMapIterator;
|
||||
begin
|
||||
iterator := TMapIterator.Create(FBreakMap);
|
||||
try
|
||||
Iterator.First;
|
||||
while not Iterator.EOM do
|
||||
begin
|
||||
Iterator.GetData(bp);
|
||||
BreakLocation := Bp.FLocation;
|
||||
if (BreakLocation >= AAdress) and (BreakLocation < (AAdress+ASize)) then
|
||||
TByteArray(AData)[BreakLocation-AAdress] := Bp.FOrgValue;
|
||||
iterator.Next;
|
||||
end;
|
||||
finally
|
||||
Iterator.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDbgProcess.WriteData(const AAdress: TDbgPtr; const ASize: Cardinal; const AData): Boolean;
|
||||
begin
|
||||
result := false;
|
||||
|
@ -348,6 +348,7 @@ begin
|
||||
Exit;
|
||||
end;
|
||||
System.Move(b^, AData, Cnt);
|
||||
MaskBreakpointsInReadData(AAdress, ASize, AData);
|
||||
result := true;
|
||||
end;
|
||||
|
||||
|
@ -233,6 +233,7 @@ begin
|
||||
Result := ReadProcessMemory(Handle, Pointer(PtrUInt(AAdress)), @AData, ASize, BytesRead) and (BytesRead = ASize);
|
||||
|
||||
if not Result then LogLastError;
|
||||
MaskBreakpointsInReadData(AAdress, ASize, AData);
|
||||
end;
|
||||
|
||||
function TDbgWinProcess.WriteData(const AAdress: TDbgPtr; const ASize: Cardinal; const AData): Boolean;
|
||||
|
Loading…
Reference in New Issue
Block a user