mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-15 06:09:30 +02:00
FpDebug: refactor new TFpBreakPointTargetHandler / adjust visibility of fields / move creation to factory method
This commit is contained in:
parent
dcd15396b9
commit
b0a5ee38f8
@ -105,6 +105,7 @@ end;
|
||||
FNumRegisters = 35; // r0..r31, SREG, SP, PC
|
||||
protected
|
||||
function CreateThread(AthreadIdentifier: THandle; out IsMainThread: boolean): TDbgThread; override;
|
||||
function CreateBreakPointTargetHandler: TFpBreakPointTargetHandler; override;
|
||||
public
|
||||
class function isSupported(target: TTargetDescriptor): boolean; override;
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
@ -474,16 +475,17 @@ begin
|
||||
result := nil;
|
||||
end;
|
||||
|
||||
function TDbgAvrProcess.CreateBreakPointTargetHandler: TFpBreakPointTargetHandler;
|
||||
begin
|
||||
Result := TAvrBreakPointTargetHandler.Create(Self);
|
||||
end;
|
||||
|
||||
constructor TDbgAvrProcess.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
begin
|
||||
FRegArrayLength := FNumRegisters;
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AMemModel, AProcessConfig);
|
||||
|
||||
FBreakTargetHandler := TAvrBreakPointTargetHandler.Create(Self);
|
||||
FBreakMap := TFpBreakPointMap.Create(Self, FBreakTargetHandler);
|
||||
TAvrBreakPointTargetHandler(FBreakTargetHandler).BreakMap := FBreakMap;
|
||||
end;
|
||||
|
||||
destructor TDbgAvrProcess.Destroy;
|
||||
|
@ -475,7 +475,7 @@ type
|
||||
TFpBreakPointTargetHandler = class abstract
|
||||
protected
|
||||
class var DBG__VERBOSE, DBG__WARNINGS, DBG__BREAKPOINTS: PLazLoggerLogGroup;
|
||||
strict protected
|
||||
strict private
|
||||
FProcess: TDbgProcess;
|
||||
FBreakMap: TFpBreakPointMap;
|
||||
protected
|
||||
@ -884,6 +884,7 @@ type
|
||||
function CreateWatchPointData: TFpWatchPointData; virtual;
|
||||
procedure Init(const AProcessID, AThreadID: Integer);
|
||||
function CreateConfig: TDbgConfig;
|
||||
function CreateBreakPointTargetHandler: TFpBreakPointTargetHandler; virtual; abstract;
|
||||
procedure InitializeLoaders; override;
|
||||
public
|
||||
class function isSupported(ATargetInfo: TTargetDescriptor): boolean; virtual;
|
||||
@ -1625,7 +1626,7 @@ function TGenericBreakPointTargetHandler.DoInsertBreakInstructionCode(
|
||||
const ALocation: TDBGPtr; out OrigValue: _BRK_STORE;
|
||||
AMakeTempRemoved: Boolean): Boolean;
|
||||
begin
|
||||
Result := FProcess.ReadData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
Result := Process.ReadData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
if not Result then begin
|
||||
DebugLn(DBG__WARNINGS or DBG__BREAKPOINTS, 'Unable to read pre-breakpoint at '+FormatAddress(ALocation));
|
||||
exit;
|
||||
@ -1634,15 +1635,15 @@ begin
|
||||
if (OrigValue = _BREAK._CODE) or AMakeTempRemoved then
|
||||
exit; // breakpoint on a hardcoded breakpoint
|
||||
|
||||
FProcess.BeforeChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
Process.BeforeChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
|
||||
Result := FProcess.WriteData(ALocation, SizeOf(_BRK_STORE), _BREAK._CODE);
|
||||
DebugLn(DBG__VERBOSE or DBG__BREAKPOINTS, ['Breakpoint set to '+FProcess.FormatAddress(ALocation), ' Result:',Result, ' OVal:', OrigValue]);
|
||||
Result := Process.WriteData(ALocation, SizeOf(_BRK_STORE), _BREAK._CODE);
|
||||
DebugLn(DBG__VERBOSE or DBG__BREAKPOINTS, ['Breakpoint set to '+Process.FormatAddress(ALocation), ' Result:',Result, ' OVal:', OrigValue]);
|
||||
if not Result then
|
||||
DebugLn(DBG__WARNINGS or DBG__BREAKPOINTS, 'Unable to set breakpoint at '+FormatAddress(ALocation));
|
||||
|
||||
if Result then
|
||||
FProcess.AfterChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
Process.AfterChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
end;
|
||||
|
||||
function TGenericBreakPointTargetHandler.DoRemoveBreakInstructionCode(
|
||||
@ -1651,14 +1652,14 @@ begin
|
||||
if OrigValue = _BREAK._CODE then
|
||||
exit(True); // breakpoint on a hardcoded breakpoint
|
||||
|
||||
FProcess.BeforeChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
Process.BeforeChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
|
||||
Result := FProcess.WriteData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
Result := Process.WriteData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
DebugLn(DBG__VERBOSE or DBG__BREAKPOINTS, ['Breakpoint removed from '+FormatAddress(ALocation), ' Result:',Result, ' OVal:', OrigValue]);
|
||||
DebugLn((not Result) and (not FProcess.GotExitProcess) and (DBG__WARNINGS or DBG__BREAKPOINTS), 'Unable to reset breakpoint at %s', [FormatAddress(ALocation)]);
|
||||
DebugLn((not Result) and (not Process.GotExitProcess) and (DBG__WARNINGS or DBG__BREAKPOINTS), 'Unable to reset breakpoint at %s', [FormatAddress(ALocation)]);
|
||||
|
||||
if Result then
|
||||
FProcess.AfterChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
Process.AfterChangingInstructionCode(ALocation, SizeOf(_BRK_STORE));
|
||||
end;
|
||||
|
||||
function TGenericBreakPointTargetHandler.HPtr(Src: PFpBreakPointTargetHandlerDataPointer): PInternalBreakLocationEntry;
|
||||
@ -2408,6 +2409,11 @@ begin
|
||||
FThreadMap := TThreadMap.Create(itu4, SizeOf(TDbgThread));
|
||||
FLibMap := TLibraryMap.Create(MAP_ID_SIZE, SizeOf(TDbgLibrary));
|
||||
FWatchPointData := CreateWatchPointData;
|
||||
|
||||
FBreakTargetHandler := CreateBreakPointTargetHandler;
|
||||
FBreakMap := TFpBreakPointMap.Create(Self, FBreakTargetHandler);
|
||||
FBreakTargetHandler.BreakMap := FBreakMap;
|
||||
|
||||
FCurrentBreakpoint := nil;
|
||||
FCurrentWatchpoint := nil;
|
||||
|
||||
|
@ -29,11 +29,8 @@ type
|
||||
{ TDbgx86Process }
|
||||
|
||||
TDbgx86Process = class(TDbgProcess)
|
||||
public
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel;
|
||||
AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
|
||||
protected
|
||||
function CreateBreakPointTargetHandler: TFpBreakPointTargetHandler; override;
|
||||
end;
|
||||
|
||||
{ TDbgStackUnwinderX86FramePointer }
|
||||
@ -91,16 +88,9 @@ end;
|
||||
|
||||
{ TDbgx86Process }
|
||||
|
||||
constructor TDbgx86Process.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
function TDbgx86Process.CreateBreakPointTargetHandler: TFpBreakPointTargetHandler;
|
||||
begin
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AMemModel,
|
||||
AProcessConfig);
|
||||
|
||||
FBreakTargetHandler := TBreakPointx86Handler.Create(Self);
|
||||
FBreakMap := TFpBreakPointMap.Create(Self, FBreakTargetHandler);
|
||||
TBreakPointx86Handler(FBreakTargetHandler).BreakMap := FBreakMap;
|
||||
Result := TBreakPointx86Handler.Create(Self);
|
||||
end;
|
||||
|
||||
{ TDbgStackUnwinderX86FramePointer }
|
||||
|
@ -215,15 +215,15 @@ function TRspBreakPointTargetHandler.DoInsertBreakInstructionCode(const
|
||||
ALocation: TDBGPtr; out OrigValue: _BRK_STORE;
|
||||
AMakeTempRemoved: Boolean): Boolean;
|
||||
begin
|
||||
if TDbgRspProcess(FProcess).FIsTerminating or (TDbgRspProcess(FProcess).FStatus = SIGHUP) then
|
||||
if TDbgRspProcess(Process).FIsTerminating or (TDbgRspProcess(Process).FStatus = SIGHUP) then
|
||||
DebugLn(DBG__WARNINGS, 'TDbgRspProcess.InsertBreakInstruction called while FIsTerminating is set.');
|
||||
|
||||
result := Fprocess.ReadData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
result := process.ReadData(ALocation, SizeOf(_BRK_STORE), OrigValue);
|
||||
if AMakeTempRemoved then
|
||||
exit;
|
||||
|
||||
// Insert HW break...
|
||||
result := TDbgRspProcess(FProcess).RspConnection.SetBreakWatchPoint(ALocation, wkpExec);
|
||||
result := TDbgRspProcess(Process).RspConnection.SetBreakWatchPoint(ALocation, wkpExec);
|
||||
if not result then
|
||||
DebugLn(DBG__WARNINGS, 'Failed to set break point.', []);
|
||||
end;
|
||||
@ -231,13 +231,13 @@ end;
|
||||
function TRspBreakPointTargetHandler.DoRemoveBreakInstructionCode(const
|
||||
ALocation: TDBGPtr; const OrigValue: _BRK_STORE): Boolean;
|
||||
begin
|
||||
if TDbgRspProcess(FProcess).FIsTerminating or (TDbgRspProcess(FProcess).FStatus = SIGHUP) then
|
||||
if TDbgRspProcess(Process).FIsTerminating or (TDbgRspProcess(Process).FStatus = SIGHUP) then
|
||||
begin
|
||||
DebugLn(DBG__WARNINGS, 'TDbgRspProcess.RemoveBreakInstructionCode called while FIsTerminating is set');
|
||||
result := false;
|
||||
end
|
||||
else
|
||||
result := TDbgRspProcess(FProcess).RspConnection.DeleteBreakWatchPoint(ALocation, wkpExec);
|
||||
result := TDbgRspProcess(Process).RspConnection.DeleteBreakWatchPoint(ALocation, wkpExec);
|
||||
end;
|
||||
|
||||
{ TDbgRspThread }
|
||||
|
Loading…
Reference in New Issue
Block a user