mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 23:00:27 +02:00
FpDebug:
* Implemented basic TFpDbgMemReader. It handles reading memory, reading register values is still not implemented * Implemented very basic evaluation of watches. git-svn-id: trunk@44630 -
This commit is contained in:
parent
0e356292c6
commit
2a7b0ee37e
@ -76,6 +76,19 @@ type
|
||||
|
||||
TDbgProcess = class;
|
||||
|
||||
{ TDbgMemReader }
|
||||
|
||||
TDbgMemReader = class(TFpDbgMemReaderBase)
|
||||
private
|
||||
FDbgProcess: TDbgProcess;
|
||||
public
|
||||
constructor Create(ADbgProcess: TDbgProcess);
|
||||
function ReadMemory(AnAddress: TDbgPtr; ASize: Cardinal; ADest: Pointer): Boolean; override;
|
||||
function ReadMemoryEx(AnAddress, AnAddressSpace: TDbgPtr; ASize: Cardinal; ADest: Pointer): Boolean; override;
|
||||
function ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean; override;
|
||||
function RegisterSize(ARegNum: Cardinal): Integer; override;
|
||||
end;
|
||||
|
||||
{ TDbgThread }
|
||||
|
||||
TDbgThread = class(TObject)
|
||||
@ -167,6 +180,8 @@ type
|
||||
FOnLog: TOnLog;
|
||||
FProcessID: Integer;
|
||||
FThreadID: Integer;
|
||||
FMemReader: TDbgMemReader;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
|
||||
procedure ThreadDestroyed(const AThread: TDbgThread);
|
||||
protected
|
||||
@ -182,6 +197,7 @@ type
|
||||
FBreakMap: TMap; // map BreakAddr -> BreakObject
|
||||
|
||||
FMainThread: TDbgThread;
|
||||
procedure LoadInfo; override;
|
||||
function GetHandle: THandle; virtual;
|
||||
procedure SetExitCode(AValue: DWord);
|
||||
function GetLastEventProcessIdentifier: THandle; virtual;
|
||||
@ -278,6 +294,40 @@ begin
|
||||
result := GOSDbgClasses;
|
||||
end;
|
||||
|
||||
{ TDbgMemReader }
|
||||
|
||||
constructor TDbgMemReader.Create(ADbgProcess: TDbgProcess);
|
||||
begin
|
||||
FDbgProcess := ADbgProcess;
|
||||
end;
|
||||
|
||||
function TDbgMemReader.ReadMemory(AnAddress: TDbgPtr; ASize: Cardinal; ADest: Pointer): Boolean;
|
||||
begin
|
||||
FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
end;
|
||||
|
||||
function TDbgMemReader.ReadMemoryEx(AnAddress, AnAddressSpace: TDbgPtr;
|
||||
ASize: Cardinal; ADest: Pointer): Boolean;
|
||||
begin
|
||||
FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
end;
|
||||
|
||||
function TDbgMemReader.ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr): Boolean;
|
||||
begin
|
||||
result := true;
|
||||
case ARegNum of
|
||||
// ToDo: Link the Dwarf-register-numbers to the actual registers.
|
||||
// 0: AValue:=FDbgProcess.MainThread.RegisterValueList.GetDbgRegister('eax').NumValue;
|
||||
else
|
||||
result := false;
|
||||
end
|
||||
end;
|
||||
|
||||
function TDbgMemReader.RegisterSize(ARegNum: Cardinal): Integer;
|
||||
begin
|
||||
result := 8;
|
||||
end;
|
||||
|
||||
{ TDbgRegisterValueList }
|
||||
|
||||
function TDbgRegisterValueList.GetDbgRegister(AName: string): TDbgRegisterValue;
|
||||
@ -426,6 +476,9 @@ begin
|
||||
FBreakMap := TMap.Create(MAP_ID_SIZE, SizeOf(TDbgBreakpoint));
|
||||
FCurrentBreakpoint := nil;
|
||||
|
||||
FMemReader := TDbgMemReader.Create(Self);
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create);
|
||||
|
||||
FSymInstances := TList.Create;
|
||||
|
||||
SetName(AName);
|
||||
@ -439,6 +492,8 @@ begin
|
||||
FreeAndNil(FThreadMap);
|
||||
FreeAndNil(FLibMap);
|
||||
FreeAndNil(FSymInstances);
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemReader);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
@ -563,6 +618,12 @@ begin
|
||||
then FMainThread := nil;
|
||||
end;
|
||||
|
||||
procedure TDbgProcess.LoadInfo;
|
||||
begin
|
||||
inherited LoadInfo;
|
||||
TFpDwarfInfo(FDbgInfo).MemManager := FMemManager;
|
||||
end;
|
||||
|
||||
function TDbgProcess.GetLastEventProcessIdentifier: THandle;
|
||||
begin
|
||||
result := 0;
|
||||
|
@ -11,8 +11,10 @@ uses
|
||||
LazLogger,
|
||||
FpDbgClasses,
|
||||
FpDbgInfo,
|
||||
FpErrorMessages,
|
||||
DbgIntfBaseTypes,
|
||||
DbgIntfDebuggerBase,
|
||||
FpPascalParser,
|
||||
FPDbgController;
|
||||
|
||||
type
|
||||
@ -122,8 +124,31 @@ begin
|
||||
end;
|
||||
|
||||
procedure TFPWatches.InternalRequestData(AWatchValue: TWatchValue);
|
||||
var
|
||||
AContext: TDbgInfoAddressContext;
|
||||
AController: TDbgController;
|
||||
APasExpr: TFpPascalExpression;
|
||||
|
||||
begin
|
||||
AWatchValue.Validity := ddsInvalid;
|
||||
AController := FpDebugger.FDbgController;
|
||||
|
||||
AContext := AController.CurrentProcess.DbgInfo.FindContext(AController.CurrentProcess.GetInstructionPointerRegisterValue);
|
||||
|
||||
APasExpr := TFpPascalExpression.Create(AWatchValue.Expression, AContext);
|
||||
try
|
||||
if not APasExpr.Valid then
|
||||
begin
|
||||
AWatchValue.Value := ErrorHandler.ErrorAsString(APasExpr.Error);
|
||||
AWatchValue.Validity := ddsError;
|
||||
end
|
||||
else
|
||||
begin
|
||||
AWatchValue.Value := IntToStr(APasExpr.ResultValue.AsInteger);
|
||||
AWatchValue.Validity := ddsValid;
|
||||
end;
|
||||
finally
|
||||
APasExpr.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TFpDebugThread }
|
||||
|
Loading…
Reference in New Issue
Block a user