mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-08 09:20:49 +02:00
* Merge branch 'lazarus-fpdebug-readregisterasaddress' into 'main'
See merge request freepascal.org/lazarus/lazarus!43
This commit is contained in:
commit
736f8182f9
@ -46,6 +46,12 @@ const
|
|||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
{ TAvrMemManager }
|
||||||
|
|
||||||
|
TAvrMemManager = class(TFpDbgMemManager)
|
||||||
|
function ReadRegisterAsAddress(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; override;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TDbgAvrThread }
|
{ TDbgAvrThread }
|
||||||
|
|
||||||
TDbgAvrThread = class(TDbgThread)
|
TDbgAvrThread = class(TDbgThread)
|
||||||
@ -171,6 +177,30 @@ uses
|
|||||||
var
|
var
|
||||||
DBG_VERBOSE, DBG_WARNINGS: PLazLoggerLogGroup;
|
DBG_VERBOSE, DBG_WARNINGS: PLazLoggerLogGroup;
|
||||||
|
|
||||||
|
{ TAvrMemManager }
|
||||||
|
|
||||||
|
function TAvrMemManager.ReadRegisterAsAddress(ARegNum: Cardinal; out
|
||||||
|
AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean;
|
||||||
|
const
|
||||||
|
AvrDataOffset = $800000;
|
||||||
|
var
|
||||||
|
tmpVal: TDBGPtr;
|
||||||
|
begin
|
||||||
|
Result := ReadRegister(ARegNum, AValue, AContext);
|
||||||
|
{ Assume the pointer points to data space.
|
||||||
|
This will be the case for stack based parameters.
|
||||||
|
But if parameters are stored in registers this could lead to confusion.
|
||||||
|
E.g. when passing a procedure pointer the pointer points to code space.
|
||||||
|
Todo: consider adding DW_AT_address_class or DW_AT_segment information on compiler side.
|
||||||
|
There will be more potential for confusion when section support is added to the compiler }
|
||||||
|
if Result then
|
||||||
|
begin
|
||||||
|
Result := ReadRegister(ARegNum+1, tmpVal, AContext);
|
||||||
|
if Result then
|
||||||
|
AValue := AvrDataOffset or (AValue + (word(tmpVal) shl 8));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TFpRspWatchPointData }
|
{ TFpRspWatchPointData }
|
||||||
|
|
||||||
function TFpRspWatchPointData.BreakWatchPoint(AnIndex: Integer
|
function TFpRspWatchPointData.BreakWatchPoint(AnIndex: Integer
|
||||||
|
@ -2310,7 +2310,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
DW_OP_breg0..DW_OP_breg31: begin
|
DW_OP_breg0..DW_OP_breg31: begin
|
||||||
if not FContext.ReadRegister(CurInstr^-DW_OP_breg0, NewValue) then begin
|
if not FContext.ReadRegisterasAddress(CurInstr^-DW_OP_breg0, NewValue) then begin
|
||||||
SetError;
|
SetError;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
@ -2319,7 +2319,7 @@ begin
|
|||||||
{$POP}
|
{$POP}
|
||||||
end;
|
end;
|
||||||
DW_OP_bregx: begin
|
DW_OP_bregx: begin
|
||||||
if not FContext.ReadRegister(ULEB128toOrdinal(CurData), NewValue) then begin
|
if not FContext.ReadRegisterasAddress(ULEB128toOrdinal(CurData), NewValue) then begin
|
||||||
SetError;
|
SetError;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
@ -105,6 +105,7 @@ type
|
|||||||
(* ReadRegister needs a Context, to get the thread/stackframe
|
(* ReadRegister needs a Context, to get the thread/stackframe
|
||||||
*)
|
*)
|
||||||
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; inline;
|
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; inline;
|
||||||
|
function ReadRegisterasAddress(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; inline;
|
||||||
|
|
||||||
function WriteMemory(const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
|
function WriteMemory(const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
|
||||||
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags = []
|
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags = []
|
||||||
@ -426,6 +427,8 @@ type
|
|||||||
(* ReadRegister needs a Context, to get the thread/stackframe
|
(* ReadRegister needs a Context, to get the thread/stackframe
|
||||||
*)
|
*)
|
||||||
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext {= nil}): Boolean;
|
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext {= nil}): Boolean;
|
||||||
|
function ReadRegisterAsAddress(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext {= nil}): Boolean; virtual;
|
||||||
|
property MemReader: TFpDbgMemReaderBase read FMemReader;
|
||||||
public
|
public
|
||||||
procedure SetCacheManager(ACacheMgr: TFpDbgMemCacheManagerBase);
|
procedure SetCacheManager(ACacheMgr: TFpDbgMemCacheManagerBase);
|
||||||
property CacheManager: TFpDbgMemCacheManagerBase read GetCacheManager;
|
property CacheManager: TFpDbgMemCacheManagerBase read GetCacheManager;
|
||||||
@ -961,6 +964,12 @@ begin
|
|||||||
Result := MemManager.ReadRegister(ARegNum, AValue, Self);
|
Result := MemManager.ReadRegister(ARegNum, AValue, Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDbgLocationContext.ReadRegisterasAddress(ARegNum: Cardinal; out
|
||||||
|
AValue: TDbgPtr): Boolean;
|
||||||
|
begin
|
||||||
|
Result := MemManager.ReadRegisterAsAddress(ARegNum, AValue, Self);
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpDbgLocationContext.WriteMemory(
|
function TFpDbgLocationContext.WriteMemory(
|
||||||
const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
|
const ADestLocation: TFpDbgMemLocation; const ASize: TFpDbgValueSize;
|
||||||
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags): Boolean;
|
const ASource: Pointer; const AFlags: TFpDbgMemManagerFlags): Boolean;
|
||||||
@ -1908,6 +1917,12 @@ begin
|
|||||||
FLastError := CreateError(fpErrFailedReadRegister);
|
FLastError := CreateError(fpErrFailedReadRegister);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDbgMemManager.ReadRegisterAsAddress(ARegNum: Cardinal; out
|
||||||
|
AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean;
|
||||||
|
begin
|
||||||
|
Result := ReadRegister(ARegNum, AValue, AContext);
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpDbgMemManager.SetLength(var ADest: TByteDynArray; ALength: Int64
|
function TFpDbgMemManager.SetLength(var ADest: TByteDynArray; ALength: Int64
|
||||||
): Boolean;
|
): Boolean;
|
||||||
begin
|
begin
|
||||||
|
@ -382,6 +382,9 @@ type
|
|||||||
procedure GetCurrentThreadAndStackFrame(out AThreadId, AStackFrame: Integer);
|
procedure GetCurrentThreadAndStackFrame(out AThreadId, AStackFrame: Integer);
|
||||||
function GetContextForEvaluate(const ThreadId, StackFrame: Integer): TFpDbgSymbolScope;
|
function GetContextForEvaluate(const ThreadId, StackFrame: Integer): TFpDbgSymbolScope;
|
||||||
|
|
||||||
|
function CreateMemReader: TDbgMemReader; virtual;
|
||||||
|
function CreateMemConverter: TFpDbgMemConvertor; virtual;
|
||||||
|
function CreateMemManager: TFpDbgMemManager; virtual;
|
||||||
function CreateLineInfo: TDBGLineInfo; override;
|
function CreateLineInfo: TDBGLineInfo; override;
|
||||||
function CreateWatches: TWatchesSupplier; override;
|
function CreateWatches: TWatchesSupplier; override;
|
||||||
function CreateThreads: TThreadsSupplier; override;
|
function CreateThreads: TThreadsSupplier; override;
|
||||||
@ -3583,6 +3586,21 @@ begin
|
|||||||
Result := FindSymbolScope(ThreadId, StackFrame);
|
Result := FindSymbolScope(ThreadId, StackFrame);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDebugDebugger.CreateMemReader: TDbgMemReader;
|
||||||
|
begin
|
||||||
|
Result := TFpDbgMemReader.Create(self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFpDebugDebugger.CreateMemConverter: TFpDbgMemConvertor;
|
||||||
|
begin
|
||||||
|
Result := TFpDbgMemConvertorLittleEndian.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFpDebugDebugger.CreateMemManager: TFpDbgMemManager;
|
||||||
|
begin
|
||||||
|
Result := TFpDbgMemManager.Create(FMemReader, FMemConverter);
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpDebugDebugger.GetClassInstanceName(AnAddr: TDBGPtr): string;
|
function TFpDebugDebugger.GetClassInstanceName(AnAddr: TDBGPtr): string;
|
||||||
var
|
var
|
||||||
AnErr: TFpError;
|
AnErr: TFpError;
|
||||||
@ -4590,9 +4608,9 @@ begin
|
|||||||
FBreakUpdateList := TBreakPointUpdateList.create();
|
FBreakUpdateList := TBreakPointUpdateList.create();
|
||||||
FExceptionStepper := TFpDebugExceptionStepping.Create(Self);
|
FExceptionStepper := TFpDebugExceptionStepping.Create(Self);
|
||||||
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
||||||
FMemReader := TFpDbgMemReader.Create(self);
|
FMemReader := CreateMemReader;
|
||||||
FMemConverter := TFpDbgMemConvertorLittleEndian.Create;
|
FMemConverter := CreateMemConverter;
|
||||||
FMemManager := TFpDbgMemManager.Create(FMemReader, FMemConverter);
|
FMemManager := CreateMemManager;
|
||||||
FMemManager.MemLimits.MaxMemReadSize := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxMemReadSize;
|
FMemManager.MemLimits.MaxMemReadSize := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxMemReadSize;
|
||||||
FMemManager.MemLimits.MaxArrayLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxArrayLen;
|
FMemManager.MemLimits.MaxArrayLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxArrayLen;
|
||||||
FMemManager.MemLimits.MaxStringLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxStringLen;
|
FMemManager.MemLimits.MaxStringLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxStringLen;
|
||||||
|
@ -22,7 +22,7 @@ type
|
|||||||
FDbgController: TDbgController;
|
FDbgController: TDbgController;
|
||||||
FMemManager: TFpDbgMemManager;
|
FMemManager: TFpDbgMemManager;
|
||||||
FMemReader: TDbgMemReader;
|
FMemReader: TDbgMemReader;
|
||||||
FMemConverter: TFpDbgMemConvertorLittleEndian;
|
FMemConverter: TFpDbgMemConvertor;
|
||||||
FLockList: TFpDbgLockList;
|
FLockList: TFpDbgLockList;
|
||||||
FWorkQueue: TFpThreadPriorityWorkerQueue;
|
FWorkQueue: TFpThreadPriorityWorkerQueue;
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ type
|
|||||||
property DbgController: TDbgController read FDbgController;
|
property DbgController: TDbgController read FDbgController;
|
||||||
property MemManager: TFpDbgMemManager read FMemManager;
|
property MemManager: TFpDbgMemManager read FMemManager;
|
||||||
property MemReader: TDbgMemReader read FMemReader;
|
property MemReader: TDbgMemReader read FMemReader;
|
||||||
property MemConverter: TFpDbgMemConvertorLittleEndian read FMemConverter;
|
property MemConverter: TFpDbgMemConvertor read FMemConverter;
|
||||||
property LockList: TFpDbgLockList read FLockList;
|
property LockList: TFpDbgLockList read FLockList;
|
||||||
property WorkQueue: TFpThreadPriorityWorkerQueue read FWorkQueue;
|
property WorkQueue: TFpThreadPriorityWorkerQueue read FWorkQueue;
|
||||||
end;
|
end;
|
||||||
|
@ -66,6 +66,8 @@ type
|
|||||||
private
|
private
|
||||||
FProcessConfig: TRemoteConfig;
|
FProcessConfig: TRemoteConfig;
|
||||||
procedure UpdateProcessConfig;
|
procedure UpdateProcessConfig;
|
||||||
|
protected
|
||||||
|
function CreateMemManager: TFpDbgMemManager; override;
|
||||||
public
|
public
|
||||||
constructor Create(const AExternalDebugger: String); override;
|
constructor Create(const AExternalDebugger: String); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -96,6 +98,11 @@ begin
|
|||||||
TRemoteConfig(FProcessConFig).SkipSectionsList.Assign(AProperties.SkipUploadOfSectionList);
|
TRemoteConfig(FProcessConFig).SkipSectionsList.Assign(AProperties.SkipUploadOfSectionList);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpRspRemoteDebugger.CreateMemManager: TFpDbgMemManager;
|
||||||
|
begin
|
||||||
|
Result := TAvrMemManager.Create(FMemReader, FMemConverter);
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TFpRspRemoteDebugger.Create(const AExternalDebugger: String);
|
constructor TFpRspRemoteDebugger.Create(const AExternalDebugger: String);
|
||||||
begin
|
begin
|
||||||
inherited Create(AExternalDebugger);
|
inherited Create(AExternalDebugger);
|
||||||
|
Loading…
Reference in New Issue
Block a user