diff --git a/components/fpdebug/fpdbgclasses.pp b/components/fpdebug/fpdbgclasses.pp index 697f699d5e..17c6c33da1 100644 --- a/components/fpdebug/fpdbgclasses.pp +++ b/components/fpdebug/fpdbgclasses.pp @@ -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; diff --git a/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas b/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas index 7fb3607386..64fa55cf35 100644 --- a/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas +++ b/components/lazdebuggers/lazdebuggerfp/fpdebugdebugger.pas @@ -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 }