mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-08 10:32:48 +02:00
228 lines
6.9 KiB
ObjectPascal
228 lines
6.9 KiB
ObjectPascal
unit RspRemoteDebugger;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fgl, math, process,
|
|
Forms, Dialogs, syncobjs,
|
|
Maps, LazLogger, LazUTF8, lazCollections,
|
|
DbgIntfBaseTypes, DbgIntfDebuggerBase,
|
|
FpDebugDebugger, FpDebugDebuggerUtils, FpDebugDebuggerWorkThreads,
|
|
// FpDebug
|
|
{$IFDEF FPDEBUG_THREAD_CHECK} FpDbgCommon, {$ENDIF}
|
|
FpDbgClasses, FpDbgInfo, FpErrorMessages, FpPascalBuilder, FpdMemoryTools,
|
|
FpPascalParser, FPDbgController, FpDbgDwarfDataClasses, FpDbgDwarfFreePascal,
|
|
FpDbgDwarf, FpDbgUtil,
|
|
DebuggerPropertiesBase,
|
|
FpDbgRsp, FpDbgAvrClasses;
|
|
|
|
type
|
|
|
|
{ TFpDebugRspProperties }
|
|
|
|
TFpDebugRspProperties = class(TFpDebugDebuggerProperties)
|
|
private
|
|
const
|
|
DEF_host = 'localhost';
|
|
DEF_port = 1234; // Default port for qemu
|
|
DEF_uploadBinary = false;
|
|
private
|
|
FHost: string;
|
|
FPort: integer;
|
|
FUploadBinary: boolean;
|
|
|
|
FAfterConnectMonitorCmds: TXmlConfStringList;
|
|
FAfterUploadMonitorCmds: TXmlConfStringList;
|
|
FSkipUploadOfSectionList: TXmlConfStringList;
|
|
// Temporary test code
|
|
FAfterUploadBreakZero: boolean;
|
|
|
|
function portIsStored: Boolean;
|
|
function hostIsStored: Boolean;
|
|
function uploadBinaryIsStored: Boolean;
|
|
procedure SetAfterConnectMonitorCmds(AValue: TXmlConfStringList);
|
|
procedure SetAfterUploadMonitorCmds(AValue: TXmlConfStringList);
|
|
procedure SetSkipUploadOfSectionList(AValue: TXmlConfStringList);
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property Host: string read FHost write FHost stored hostIsStored;
|
|
property Port: integer read FPort write FPort stored portIsStored default DEF_port;
|
|
property UploadBinary: Boolean read FUploadBinary write FUploadBinary stored uploadBinaryIsStored default DEF_uploadBinary;
|
|
property AfterConnectMonitorCmds: TXmlConfStringList read FAfterConnectMonitorCmds write SetAfterConnectMonitorCmds;
|
|
property AfterUploadMonitorCmds: TXmlConfStringList read FAfterUploadMonitorCmds write SetAfterUploadMonitorCmds;
|
|
property SkipUploadOfSectionList: TXmlConfStringList read FSkipUploadOfSectionList write SetSkipUploadOfSectionList;
|
|
// Temporary test code
|
|
property AfterUploadBreakZero: boolean read FAfterUploadBreakZero write FAfterUploadBreakZero default false;
|
|
end;
|
|
|
|
{ TFpRspRemoteDebugger }
|
|
|
|
TFpRspRemoteDebugger = class(TFpDebugDebugger)
|
|
private
|
|
FProcessConfig: TRemoteConfig;
|
|
procedure UpdateProcessConfig;
|
|
public
|
|
constructor Create(const AExternalDebugger: String); override;
|
|
destructor Destroy; override;
|
|
class function CreateProperties: TDebuggerProperties; override;
|
|
class function Caption: String; override;
|
|
function RequestCommand(const ACommand: TDBGCommand;
|
|
const AParams: array of const;
|
|
const ACallback: TMethod): Boolean; override;
|
|
end;
|
|
|
|
procedure Register;
|
|
|
|
implementation
|
|
|
|
{ TFpRspRemoteDebugger }
|
|
|
|
procedure TFpRspRemoteDebugger.UpdateProcessConfig;
|
|
var
|
|
AProperties: TFpDebugRspProperties;
|
|
begin
|
|
AProperties := TFpDebugRspProperties(GetProperties);
|
|
TRemoteConfig(FProcessConFig).Host := AProperties.Host;
|
|
TRemoteConfig(FProcessConFig).Port := AProperties.Port;
|
|
TRemoteConfig(FProcessConFig).UploadBinary := AProperties.UploadBinary;
|
|
TRemoteConfig(FProcessConFig).AfterUploadBreakZero := AProperties.AfterUploadBreakZero;
|
|
TRemoteConfig(FProcessConFig).AfterConnectMonitorCmds.Assign(AProperties.AfterConnectMonitorCmds);
|
|
TRemoteConfig(FProcessConFig).AfterUploadMonitorCmds.Assign(AProperties.AfterUploadMonitorCmds);
|
|
TRemoteConfig(FProcessConFig).SkipSectionsList.Assign(AProperties.SkipUploadOfSectionList);
|
|
end;
|
|
|
|
constructor TFpRspRemoteDebugger.Create(const AExternalDebugger: String);
|
|
begin
|
|
inherited Create(AExternalDebugger);
|
|
if Assigned(FProcessConFig) then
|
|
FreeAndNil(FProcessConFig);
|
|
FProcessConFig := TRemoteConfig.Create;
|
|
end;
|
|
|
|
destructor TFpRspRemoteDebugger.Destroy;
|
|
begin
|
|
TRemoteConfig(FProcessConFig).Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
class function TFpRspRemoteDebugger.CreateProperties: TDebuggerProperties;
|
|
begin
|
|
Result := TFpDebugRspProperties.Create;
|
|
end;
|
|
|
|
class function TFpRspRemoteDebugger.Caption: String;
|
|
begin
|
|
Result:='FpDebug Dwarf remote debugger - RSP';
|
|
end;
|
|
|
|
function TFpRspRemoteDebugger.RequestCommand(const ACommand: TDBGCommand;
|
|
const AParams: array of const; const ACallback: TMethod): Boolean;
|
|
begin
|
|
if (ACommand in [dcRun, dcStepOver, dcStepInto, dcStepOut, dcStepTo, dcRunTo, dcJumpto,
|
|
dcStepOverInstr, dcStepIntoInstr, dcAttach]) and
|
|
not assigned(FDbgController.MainProcess)
|
|
then
|
|
begin
|
|
UpdateProcessConfig;
|
|
FDbgController.ProcessConfig := FProcessConFig;
|
|
end;
|
|
|
|
Result := inherited RequestCommand(ACommand, AParams, ACallback);
|
|
end;
|
|
|
|
{ TFpDebugRspProperties }
|
|
|
|
function TFpDebugRspProperties.portIsStored: Boolean;
|
|
begin
|
|
Result := DEF_port <> FPort;
|
|
end;
|
|
|
|
function TFpDebugRspProperties.hostIsStored: Boolean;
|
|
begin
|
|
Result := FHost <> DEF_host;
|
|
end;
|
|
|
|
function TFpDebugRspProperties.uploadBinaryIsStored: Boolean;
|
|
begin
|
|
Result := FUploadBinary <> DEF_uploadBinary;
|
|
end;
|
|
|
|
procedure TFpDebugRspProperties.SetAfterConnectMonitorCmds(
|
|
AValue: TXmlConfStringList);
|
|
begin
|
|
FAfterConnectMonitorCmds.Assign(AValue);
|
|
end;
|
|
|
|
procedure TFpDebugRspProperties.SetAfterUploadMonitorCmds(
|
|
AValue: TXmlConfStringList);
|
|
begin
|
|
FAfterUploadMonitorCmds.Assign(AValue);
|
|
end;
|
|
|
|
procedure TFpDebugRspProperties.SetSkipUploadOfSectionList(
|
|
AValue: TXmlConfStringList);
|
|
begin
|
|
FSkipUploadOfSectionList.Assign(AValue);
|
|
end;
|
|
|
|
constructor TFpDebugRspProperties.Create;
|
|
begin
|
|
inherited Create;
|
|
FHost := DEF_host;
|
|
FPort := DEF_port;
|
|
FUploadBinary := DEF_uploadBinary;
|
|
|
|
FAfterConnectMonitorCmds := TXmlConfStringList.Create;
|
|
FAfterUploadMonitorCmds := TXmlConfStringList.Create;
|
|
FSkipUploadOfSectionList := TXmlConfStringList.Create;
|
|
end;
|
|
|
|
destructor TFpDebugRspProperties.Destroy;
|
|
begin
|
|
FAfterConnectMonitorCmds.Free;
|
|
FAfterUploadMonitorCmds.Free;
|
|
FSkipUploadOfSectionList.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TFpDebugRspProperties.Assign(Source: TPersistent);
|
|
var
|
|
asource: TFpDebugRspProperties;
|
|
begin
|
|
if Source is TFpDebugRspProperties then
|
|
begin
|
|
aSource := TFpDebugRspProperties(Source);
|
|
FHost := asource.FHost;
|
|
FPort := asource.FPort;
|
|
FUploadBinary := asource.FUploadBinary;
|
|
|
|
if Assigned(asource.FAfterConnectMonitorCmds) then
|
|
FAfterConnectMonitorCmds.Assign(aSource.FAfterConnectMonitorCmds);
|
|
|
|
if Assigned(asource.FAfterUploadMonitorCmds) then
|
|
FAfterUploadMonitorCmds.Assign(aSource.FAfterUploadMonitorCmds);
|
|
|
|
if Assigned(asource.FSkipUploadOfSectionList) then
|
|
FSkipUploadOfSectionList.Assign(aSource.FSkipUploadOfSectionList);
|
|
|
|
FAfterUploadBreakZero := TFpDebugRspProperties(Source).FAfterUploadBreakZero;
|
|
end;
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
procedure Register;
|
|
begin
|
|
//RegisterDebugger(TFpRspRemoteDebugger);
|
|
end;
|
|
|
|
initialization
|
|
RegisterDebugger(TFpRspRemoteDebugger);
|
|
|
|
end.
|
|
|