LazDebuggerFp (pure): Hide software breakpoints (int3) on reading data

git-svn-id: trunk@44704 -
This commit is contained in:
joost 2014-04-12 16:24:46 +00:00
parent 0e62389d08
commit 8f5701ed19
3 changed files with 26 additions and 0 deletions

View File

@ -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;

View File

@ -348,6 +348,7 @@ begin
Exit;
end;
System.Move(b^, AData, Cnt);
MaskBreakpointsInReadData(AAdress, ASize, AData);
result := true;
end;

View File

@ -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;