mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-03 04:40:30 +02:00
FpDebug (pure): Detect if a HW breakpoint has been triggered on Linux
git-svn-id: trunk@46045 -
This commit is contained in:
parent
45dcb0b2e9
commit
8fd0269bae
@ -231,6 +231,7 @@ type
|
|||||||
function ResetInstructionPointerAfterBreakpoint: boolean; override;
|
function ResetInstructionPointerAfterBreakpoint: boolean; override;
|
||||||
function AddWatchpoint(AnAddr: TDBGPtr): integer; override;
|
function AddWatchpoint(AnAddr: TDBGPtr): integer; override;
|
||||||
function RemoveWatchpoint(AnId: integer): boolean; override;
|
function RemoveWatchpoint(AnId: integer): boolean; override;
|
||||||
|
function DetectHardwareWatchpoint: integer; override;
|
||||||
procedure BeforeContinue; override;
|
procedure BeforeContinue; override;
|
||||||
procedure LoadRegisterValues; override;
|
procedure LoadRegisterValues; override;
|
||||||
end;
|
end;
|
||||||
@ -433,10 +434,27 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TDbgLinuxThread.DetectHardwareWatchpoint: integer;
|
||||||
|
var
|
||||||
|
dr6: PtrUInt;
|
||||||
|
begin
|
||||||
|
result := -1;
|
||||||
|
if ReadDebugReg(6, dr6) then
|
||||||
|
begin
|
||||||
|
if dr6 and 1 = 1 then result := 0
|
||||||
|
else if dr6 and 2 = 2 then result := 1
|
||||||
|
else if dr6 and 4 = 4 then result := 2
|
||||||
|
else if dr6 and 8 = 8 then result := 3;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDbgLinuxThread.BeforeContinue;
|
procedure TDbgLinuxThread.BeforeContinue;
|
||||||
var
|
var
|
||||||
io: iovec;
|
io: iovec;
|
||||||
begin
|
begin
|
||||||
|
if Process.CurrentWatchpoint>-1 then
|
||||||
|
WriteDebugReg(6, 0);
|
||||||
|
|
||||||
if FUserRegsChanged then
|
if FUserRegsChanged then
|
||||||
begin
|
begin
|
||||||
io.iov_base:=@(FUserRegs.regs64[0]);
|
io.iov_base:=@(FUserRegs.regs64[0]);
|
||||||
|
Loading…
Reference in New Issue
Block a user