mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2026-01-04 15:30:40 +01:00
LazDebuggerFp (pure): Added reading of register support to TDbgMemReader.
git-svn-id: trunk@44689 -
This commit is contained in:
parent
f06246a43f
commit
c7e539dc46
@ -49,17 +49,20 @@ type
|
||||
|
||||
TDbgRegisterValue = class
|
||||
private
|
||||
FDwarfIdx: cardinal;
|
||||
FName: string;
|
||||
FNuwValue: TDBGPtr;
|
||||
FNumValue: TDBGPtr;
|
||||
FSize: byte;
|
||||
FStrValue: string;
|
||||
FValue: TDBGPtr;
|
||||
public
|
||||
constructor Create(AName: String);
|
||||
procedure SetValue(ANumValue: TDBGPtr; AStrValue: string);
|
||||
procedure SetValue(ANumValue: TDBGPtr; AStrValue: string; ASize: byte; ADwarfIdx: cardinal);
|
||||
procedure Setx86EFlagsValue(ANumValue: TDBGPtr);
|
||||
property Name: string read FName;
|
||||
property NumValue: TDBGPtr read FValue;
|
||||
property NumValue: TDBGPtr read FNumValue;
|
||||
property StrValue: string read FStrValue;
|
||||
property Size: byte read FSize;
|
||||
property DwarfIdx: cardinal read FDwarfIdx;
|
||||
end;
|
||||
|
||||
TGDbgRegisterValueList = specialize TFPGList<TDbgRegisterValue>;
|
||||
@ -72,6 +75,7 @@ type
|
||||
function GetDbgRegisterAutoCreate(AName: string): TDbgRegisterValue;
|
||||
public
|
||||
property DbgRegisterAutoCreate[AName: string]: TDbgRegisterValue read GetDbgRegisterAutoCreate;
|
||||
function FindRegisterByDwarfIndex(AnIdx: cardinal): TDbgRegisterValue;
|
||||
end;
|
||||
|
||||
TDbgProcess = class;
|
||||
@ -305,25 +309,38 @@ end;
|
||||
|
||||
function TDbgMemReader.ReadMemory(AnAddress: TDbgPtr; ASize: Cardinal; ADest: Pointer): Boolean;
|
||||
begin
|
||||
FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
result := FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
end;
|
||||
|
||||
function TDbgMemReader.ReadMemoryEx(AnAddress, AnAddressSpace: TDbgPtr;
|
||||
ASize: Cardinal; ADest: Pointer): Boolean;
|
||||
begin
|
||||
FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
result := FDbgProcess.ReadData(AnAddress, ASize, ADest^);
|
||||
end;
|
||||
|
||||
function TDbgMemReader.ReadRegister(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgAddressContext): Boolean;
|
||||
var
|
||||
ARegister: TDbgRegisterValue;
|
||||
begin
|
||||
result := false;
|
||||
// ToDo: Link the Dwarf-register-numbers to the actual registers.
|
||||
// AValue:=FDbgProcess.MainThread.RegisterValueList.GetDbgRegister('eax').NumValue;
|
||||
ARegister:=FDbgProcess.MainThread.RegisterValueList.FindRegisterByDwarfIndex(ARegNum);
|
||||
if assigned(ARegister) then
|
||||
begin
|
||||
AValue := ARegister.NumValue;
|
||||
result := true;
|
||||
end
|
||||
else
|
||||
result := false;
|
||||
end;
|
||||
|
||||
function TDbgMemReader.RegisterSize(ARegNum: Cardinal): Integer;
|
||||
var
|
||||
ARegister: TDbgRegisterValue;
|
||||
begin
|
||||
result := 8;
|
||||
ARegister:=FDbgProcess.MainThread.RegisterValueList.FindRegisterByDwarfIndex(ARegNum);
|
||||
if assigned(ARegister) then
|
||||
result := ARegister.Size
|
||||
else
|
||||
result := sizeof(pointer);
|
||||
end;
|
||||
|
||||
{ TDbgRegisterValueList }
|
||||
@ -351,6 +368,19 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDbgRegisterValueList.FindRegisterByDwarfIndex(AnIdx: cardinal): TDbgRegisterValue;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Count-1 do
|
||||
if Items[i].DwarfIdx=AnIdx then
|
||||
begin
|
||||
result := Items[i];
|
||||
exit;
|
||||
end;
|
||||
result := nil;
|
||||
end;
|
||||
|
||||
{ TDbgRegisterValue }
|
||||
|
||||
constructor TDbgRegisterValue.Create(AName: String);
|
||||
@ -358,10 +388,13 @@ begin
|
||||
FName:=AName;
|
||||
end;
|
||||
|
||||
procedure TDbgRegisterValue.SetValue(ANumValue: TDBGPtr; AStrValue: string);
|
||||
procedure TDbgRegisterValue.SetValue(ANumValue: TDBGPtr; AStrValue: string;
|
||||
ASize: byte; ADwarfIdx: Cardinal);
|
||||
begin
|
||||
FStrValue:=AStrValue;
|
||||
FNuwValue:=ANumValue;
|
||||
FNumValue:=ANumValue;
|
||||
FSize:=ASize;
|
||||
FDwarfIdx:=ADwarfIdx;
|
||||
end;
|
||||
|
||||
procedure TDbgRegisterValue.Setx86EFlagsValue(ANumValue: TDBGPtr);
|
||||
@ -387,7 +420,7 @@ begin
|
||||
if ANumValue and (1 shl 20) <> 0 then FlagS := FlagS + 'VIP ';
|
||||
if ANumValue and (1 shl 21) <> 0 then FlagS := FlagS + 'ID ';
|
||||
|
||||
SetValue(ANumValue, trim(FlagS));
|
||||
SetValue(ANumValue, trim(FlagS),4,-1);
|
||||
end;
|
||||
|
||||
{ TDbgInstance }
|
||||
|
||||
@ -180,24 +180,24 @@ procedure TDbgDarwinThread.LoadRegisterValues;
|
||||
begin
|
||||
with FThreadState do
|
||||
begin
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eax'].SetValue(__eax, IntToStr(__eax));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ecx'].SetValue(__ecx, IntToStr(__ecx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edx'].SetValue(__edx, IntToStr(__edx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebx'].SetValue(__ebx, IntToStr(__ebx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esp'].SetValue(__esp, IntToStr(__esp));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebp'].SetValue(__ebp, IntToStr(__ebp));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esi'].SetValue(__esi, IntToStr(__esi));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edi'].SetValue(__edi, IntToStr(__edi));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eip'].SetValue(__eip, IntToStr(__eip));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eax'].SetValue(__eax, IntToStr(__eax),4,0);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ecx'].SetValue(__ecx, IntToStr(__ecx),4,1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edx'].SetValue(__edx, IntToStr(__edx),4,2);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebx'].SetValue(__ebx, IntToStr(__ebx),4,3);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esp'].SetValue(__esp, IntToStr(__esp),4,4);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebp'].SetValue(__ebp, IntToStr(__ebp),4,5);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esi'].SetValue(__esi, IntToStr(__esi),4,6);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edi'].SetValue(__edi, IntToStr(__edi),4,7);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eip'].SetValue(__eip, IntToStr(__eip),4,8);
|
||||
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eflags'].Setx86EFlagsValue(__eflags);
|
||||
|
||||
FRegisterValueList.DbgRegisterAutoCreate['cs'].SetValue(__cs, IntToStr(__cs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ss'].SetValue(__ss, IntToStr(__ss));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ds'].SetValue(__ds, IntToStr(__ds));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['es'].SetValue(__es, IntToStr(__es));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['fs'].SetValue(__fs, IntToStr(__fs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(__gs, IntToStr(__gs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['cs'].SetValue(__cs, IntToStr(__cs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ss'].SetValue(__ss, IntToStr(__ss),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ds'].SetValue(__ds, IntToStr(__ds),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['es'].SetValue(__es, IntToStr(__es),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['fs'].SetValue(__fs, IntToStr(__fs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(__gs, IntToStr(__gs),4,-1);
|
||||
end;
|
||||
FRegisterValueListValid:=true;
|
||||
end;
|
||||
|
||||
@ -933,24 +933,24 @@ procedure TDbgWinThread.LoadRegisterValues;
|
||||
begin
|
||||
with GCurrentContext^ do
|
||||
begin
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eax'].SetValue(Eax, IntToStr(Eax));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ecx'].SetValue(Ecx, IntToStr(Ecx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edx'].SetValue(Edx, IntToStr(Edx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebx'].SetValue(Ebx, IntToStr(Ebx));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esp'].SetValue(Esp, IntToStr(Esp));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebp'].SetValue(Ebp, IntToStr(Ebp));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esi'].SetValue(Esi, IntToStr(Esi));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edi'].SetValue(Edi, IntToStr(Edi));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eip'].SetValue(Eip, IntToStr(Eip));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eax'].SetValue(Eax, IntToStr(Eax),4,0);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ecx'].SetValue(Ecx, IntToStr(Ecx),4,1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edx'].SetValue(Edx, IntToStr(Edx),4,2);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebx'].SetValue(Ebx, IntToStr(Ebx),4,3);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esp'].SetValue(Esp, IntToStr(Esp),4,4);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ebp'].SetValue(Ebp, IntToStr(Ebp),4,5);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['esi'].SetValue(Esi, IntToStr(Esi),4,6);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['edi'].SetValue(Edi, IntToStr(Edi),4,7);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eip'].SetValue(Eip, IntToStr(Eip),4,8);
|
||||
|
||||
FRegisterValueList.DbgRegisterAutoCreate['eflags'].Setx86EFlagsValue(EFlags);
|
||||
|
||||
FRegisterValueList.DbgRegisterAutoCreate['cs'].SetValue(SegCs, IntToStr(SegCs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ss'].SetValue(SegSs, IntToStr(SegSs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ds'].SetValue(SegDs, IntToStr(SegDs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['es'].SetValue(SegEs, IntToStr(SegEs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['fs'].SetValue(SegFs, IntToStr(SegFs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(SegGs, IntToStr(SegGs));
|
||||
FRegisterValueList.DbgRegisterAutoCreate['cs'].SetValue(SegCs, IntToStr(SegCs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ss'].SetValue(SegSs, IntToStr(SegSs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['ds'].SetValue(SegDs, IntToStr(SegDs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['es'].SetValue(SegEs, IntToStr(SegEs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['fs'].SetValue(SegFs, IntToStr(SegFs),4,-1);
|
||||
FRegisterValueList.DbgRegisterAutoCreate['gs'].SetValue(SegGs, IntToStr(SegGs),4,-1);
|
||||
end;
|
||||
FRegisterValueListValid:=true;
|
||||
end;
|
||||
|
||||
@ -223,7 +223,7 @@ begin
|
||||
for i := 0 to ARegisterList.Count-1 do
|
||||
begin
|
||||
ARegisterValue := ARegisters.EntriesByName[ARegisterList[i].Name];
|
||||
ARegisterValue.ValueObj.SetAsNum(ARegisterList[i].NumValue, SizeOf(ARegisterList[i].NumValue));
|
||||
ARegisterValue.ValueObj.SetAsNum(ARegisterList[i].NumValue, ARegisterList[i].Size);
|
||||
ARegisterValue.ValueObj.SetAsText(ARegisterList[i].StrValue);
|
||||
ARegisterValue.DataValidity:=ddsValid;
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user