FpDebug: refactor new TFpBreakPointTargetHandler / adjust visibility of fields / move creation to factory method

This commit is contained in:
Martin 2024-02-19 12:20:25 +01:00
parent dcd15396b9
commit b0a5ee38f8
4 changed files with 31 additions and 33 deletions

View File

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

View File

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

View File

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

View File

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