mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 17:39:22 +02:00
LazDebuggerFPDServer: Implemented retrieval of registers
git-svn-id: trunk@49383 -
This commit is contained in:
parent
29d5e6d734
commit
2eb7213f3c
@ -232,6 +232,21 @@ type
|
|||||||
procedure DoOnCommandFailed(ACommandResponse: TJSonObject); override;
|
procedure DoOnCommandFailed(ACommandResponse: TJSonObject); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TFPDSendRegistersCommand }
|
||||||
|
|
||||||
|
TFPDSendRegistersCommand = class(TFPDSendCommand)
|
||||||
|
private
|
||||||
|
FRegisters: TRegisters;
|
||||||
|
procedure DoRegistersFreed(Sender: TObject);
|
||||||
|
protected
|
||||||
|
procedure ComposeJSon(AJsonObject: TJSONObject); override;
|
||||||
|
public
|
||||||
|
constructor create(ARegisters: TRegisters);
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure DoOnCommandSuccesfull(ACommandResponse: TJSonObject); override;
|
||||||
|
procedure DoOnCommandFailed(ACommandResponse: TJSonObject); override;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TFPDSendDisassembleCommand }
|
{ TFPDSendDisassembleCommand }
|
||||||
|
|
||||||
TFPDSendDisassembleCommand = class(TFPDSendCommand)
|
TFPDSendDisassembleCommand = class(TFPDSendCommand)
|
||||||
@ -308,6 +323,7 @@ type
|
|||||||
function CreateBreakPoints: TDBGBreakPoints; override;
|
function CreateBreakPoints: TDBGBreakPoints; override;
|
||||||
function CreateWatches: TWatchesSupplier; override;
|
function CreateWatches: TWatchesSupplier; override;
|
||||||
function CreateLocals: TLocalsSupplier; override;
|
function CreateLocals: TLocalsSupplier; override;
|
||||||
|
function CreateRegisters: TRegisterSupplier; override;
|
||||||
function CreateCallStack: TCallStackSupplier; override;
|
function CreateCallStack: TCallStackSupplier; override;
|
||||||
function CreateDisassembler: TDBGDisassembler; override;
|
function CreateDisassembler: TDBGDisassembler; override;
|
||||||
function RequestCommand(const ACommand: TDBGCommand; const AParams: array of const): Boolean; override;
|
function RequestCommand(const ACommand: TDBGCommand; const AParams: array of const): Boolean; override;
|
||||||
@ -374,6 +390,13 @@ type
|
|||||||
procedure RequestData(ALocals: TLocals); override;
|
procedure RequestData(ALocals: TLocals); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TFPRegisters }
|
||||||
|
|
||||||
|
TFPRegisters = class(TRegisterSupplier)
|
||||||
|
public
|
||||||
|
procedure RequestData(ARegisters: TRegisters); override;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TFPWatches }
|
{ TFPWatches }
|
||||||
|
|
||||||
TFPWatches = class(TWatchesSupplier)
|
TFPWatches = class(TWatchesSupplier)
|
||||||
@ -403,6 +426,82 @@ end;
|
|||||||
|
|
||||||
var GCommandUID: integer = 0;
|
var GCommandUID: integer = 0;
|
||||||
|
|
||||||
|
{ TFPRegisters }
|
||||||
|
|
||||||
|
procedure TFPRegisters.RequestData(ARegisters: TRegisters);
|
||||||
|
begin
|
||||||
|
if (Debugger = nil) or not(Debugger.State = dsPause)
|
||||||
|
then begin
|
||||||
|
ARegisters.DataValidity:=ddsInvalid;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TFPDServerDebugger(Debugger).QueueCommand(TFPDSendRegistersCommand.create(ARegisters));
|
||||||
|
ARegisters.DataValidity := ddsRequested;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TFPDSendRegistersCommand }
|
||||||
|
|
||||||
|
procedure TFPDSendRegistersCommand.DoRegistersFreed(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FRegisters := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFPDSendRegistersCommand.ComposeJSon(AJsonObject: TJSONObject);
|
||||||
|
begin
|
||||||
|
inherited ComposeJSon(AJsonObject);
|
||||||
|
AJsonObject.Add('command','registers');
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TFPDSendRegistersCommand.create(ARegisters: TRegisters);
|
||||||
|
begin
|
||||||
|
inherited create(true);
|
||||||
|
ARegisters.AddFreeNotification(@DoRegistersFreed);
|
||||||
|
FRegisters := ARegisters;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TFPDSendRegistersCommand.Destroy;
|
||||||
|
begin
|
||||||
|
if assigned(FRegisters) then
|
||||||
|
FRegisters.RemoveFreeNotification(@DoRegistersFreed);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFPDSendRegistersCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
|
||||||
|
var
|
||||||
|
JSonRegisterArr: TJSONArray;
|
||||||
|
JSonRegisterEntryObj: TJSONObject;
|
||||||
|
i: Integer;
|
||||||
|
RegisterValue: TRegisterValue;
|
||||||
|
begin
|
||||||
|
inherited DoOnCommandSuccesfull(ACommandResponse);
|
||||||
|
if assigned(FRegisters) then
|
||||||
|
begin
|
||||||
|
FRegisters.Clear;
|
||||||
|
|
||||||
|
JSonRegisterArr := ACommandResponse.Get('registers', TJSONArray(nil));
|
||||||
|
if assigned(JSonRegisterArr) and (JSonRegisterArr.Count>0) then
|
||||||
|
begin
|
||||||
|
for i := 0 to JSonRegisterArr.Count - 1 do
|
||||||
|
begin
|
||||||
|
JSonRegisterEntryObj := JSonRegisterArr.Items[i] as TJSONObject;
|
||||||
|
RegisterValue := FRegisters.EntriesByName[JSonRegisterEntryObj.Get('name', '')];
|
||||||
|
RegisterValue.ValueObj.SetAsNum(JSonRegisterEntryObj.Get('numvalue', 0), JSonRegisterEntryObj.Get('size', 4));
|
||||||
|
RegisterValue.ValueObj.SetAsText(JSonRegisterEntryObj.Get('value', ''));
|
||||||
|
RegisterValue.DataValidity:=ddsValid;
|
||||||
|
end;
|
||||||
|
FRegisters.DataValidity := ddsValid;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
FRegisters.DataValidity := ddsInvalid;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFPDSendRegistersCommand.DoOnCommandFailed(ACommandResponse: TJSonObject);
|
||||||
|
begin
|
||||||
|
FRegisters.DataValidity := ddsInvalid;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TFPDSendLocalsCommand }
|
{ TFPDSendLocalsCommand }
|
||||||
|
|
||||||
procedure TFPDSendLocalsCommand.DoLocalsFreed(Sender: TObject);
|
procedure TFPDSendLocalsCommand.DoLocalsFreed(Sender: TObject);
|
||||||
@ -440,7 +539,7 @@ begin
|
|||||||
if assigned(FLocals) then
|
if assigned(FLocals) then
|
||||||
begin
|
begin
|
||||||
FLocals.Clear;
|
FLocals.Clear;
|
||||||
JSonLocalsArr := ACommandResponse.Get('variables', TJSONArray(nil));
|
JSonLocalsArr := ACommandResponse.Get('locals', TJSONArray(nil));
|
||||||
if assigned(JSonLocalsArr) and (JSonLocalsArr.Count>0) then
|
if assigned(JSonLocalsArr) and (JSonLocalsArr.Count>0) then
|
||||||
begin
|
begin
|
||||||
for i := 0 to JSonLocalsArr.Count - 1 do
|
for i := 0 to JSonLocalsArr.Count - 1 do
|
||||||
@ -448,7 +547,6 @@ begin
|
|||||||
JSonLocalsEntryObj := JSonLocalsArr.Items[i] as TJSONObject;
|
JSonLocalsEntryObj := JSonLocalsArr.Items[i] as TJSONObject;
|
||||||
FLocals.Add(JSonLocalsEntryObj.Get('name', ''), JSonLocalsEntryObj.Get('value', ''));
|
FLocals.Add(JSonLocalsEntryObj.Get('name', ''), JSonLocalsEntryObj.Get('value', ''));
|
||||||
end;
|
end;
|
||||||
FLocals.SetDataValidity(ddsValid);
|
|
||||||
end;
|
end;
|
||||||
FLocals.SetDataValidity(ddsValid);
|
FLocals.SetDataValidity(ddsValid);
|
||||||
end;
|
end;
|
||||||
@ -1315,6 +1413,11 @@ begin
|
|||||||
Result := TFPLocals.Create(Self);
|
Result := TFPLocals.Create(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFPDServerDebugger.CreateRegisters: TRegisterSupplier;
|
||||||
|
begin
|
||||||
|
Result:=TFPRegisters.Create(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
function TFPDServerDebugger.CreateCallStack: TCallStackSupplier;
|
function TFPDServerDebugger.CreateCallStack: TCallStackSupplier;
|
||||||
begin
|
begin
|
||||||
Result:=TFPCallStackSupplier.Create(Self);
|
Result:=TFPCallStackSupplier.Create(Self);
|
||||||
|
Loading…
Reference in New Issue
Block a user