* 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:
joost 2014-04-07 09:23:40 +00:00
parent 0e356292c6
commit 2a7b0ee37e
2 changed files with 87 additions and 1 deletions

View File

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

View File

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