mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-02 18:40: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);
|
procedure SetExitCode(AValue: DWord);
|
||||||
function GetLastEventProcessIdentifier: THandle; virtual;
|
function GetLastEventProcessIdentifier: THandle; virtual;
|
||||||
function DoBreak(BreakpointAddress: TDBGPtr; AThreadID: integer): Boolean;
|
function DoBreak(BreakpointAddress: TDBGPtr; AThreadID: integer): Boolean;
|
||||||
|
procedure MaskBreakpointsInReadData(const AAdress: TDbgPtr; const ASize: Cardinal; var AData);
|
||||||
public
|
public
|
||||||
class function StartInstance(AFileName: string; AParams: string): TDbgProcess; virtual;
|
class function StartInstance(AFileName: string; AParams: string): TDbgProcess; virtual;
|
||||||
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); 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
|
then FCurrentBreakpoint := nil; // no need for a singlestep if we continue
|
||||||
end;
|
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;
|
function TDbgProcess.WriteData(const AAdress: TDbgPtr; const ASize: Cardinal; const AData): Boolean;
|
||||||
begin
|
begin
|
||||||
result := false;
|
result := false;
|
||||||
|
@ -348,6 +348,7 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
System.Move(b^, AData, Cnt);
|
System.Move(b^, AData, Cnt);
|
||||||
|
MaskBreakpointsInReadData(AAdress, ASize, AData);
|
||||||
result := true;
|
result := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -233,6 +233,7 @@ begin
|
|||||||
Result := ReadProcessMemory(Handle, Pointer(PtrUInt(AAdress)), @AData, ASize, BytesRead) and (BytesRead = ASize);
|
Result := ReadProcessMemory(Handle, Pointer(PtrUInt(AAdress)), @AData, ASize, BytesRead) and (BytesRead = ASize);
|
||||||
|
|
||||||
if not Result then LogLastError;
|
if not Result then LogLastError;
|
||||||
|
MaskBreakpointsInReadData(AAdress, ASize, AData);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDbgWinProcess.WriteData(const AAdress: TDbgPtr; const ASize: Cardinal; const AData): Boolean;
|
function TDbgWinProcess.WriteData(const AAdress: TDbgPtr; const ASize: Cardinal; const AData): Boolean;
|
||||||
|
Loading…
Reference in New Issue
Block a user