mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 16:49:12 +02:00
LazDebuggerFp (pure): Handle working-directory and environment of debuggee
git-svn-id: trunk@44936 -
This commit is contained in:
parent
334403f906
commit
31762452ae
@ -263,7 +263,7 @@ type
|
|||||||
function DoBreak(BreakpointAddress: TDBGPtr; AThreadID: integer): Boolean;
|
function DoBreak(BreakpointAddress: TDBGPtr; AThreadID: integer): Boolean;
|
||||||
procedure MaskBreakpointsInReadData(const AAdress: TDbgPtr; const ASize: Cardinal; var AData);
|
procedure MaskBreakpointsInReadData(const AAdress: TDbgPtr; const ASize: Cardinal; var AData);
|
||||||
public
|
public
|
||||||
class function StartInstance(AFileName: string; AParams: TStringList): TDbgProcess; virtual;
|
class function StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess; virtual;
|
||||||
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); virtual;
|
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); virtual;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function AddBreak(const ALocation: TDbgPtr): TDbgBreakpoint; overload;
|
function AddBreak(const ALocation: TDbgPtr): TDbgBreakpoint; overload;
|
||||||
@ -799,7 +799,7 @@ begin
|
|||||||
FExitCode:=AValue;
|
FExitCode:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TDbgProcess.StartInstance(AFileName: string; AParams: TStringList): TDbgProcess;
|
class function TDbgProcess.StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess;
|
||||||
begin
|
begin
|
||||||
DebugLn('Debug support for this platform is not available.');
|
DebugLn('Debug support for this platform is not available.');
|
||||||
result := nil;
|
result := nil;
|
||||||
|
@ -23,6 +23,7 @@ type
|
|||||||
|
|
||||||
TDbgController = class
|
TDbgController = class
|
||||||
private
|
private
|
||||||
|
FEnvironment: TStrings;
|
||||||
FExecutableFilename: string;
|
FExecutableFilename: string;
|
||||||
FOnCreateProcessEvent: TOnCreateProcessEvent;
|
FOnCreateProcessEvent: TOnCreateProcessEvent;
|
||||||
FOnDebugInfoLoaded: TNotifyEvent;
|
FOnDebugInfoLoaded: TNotifyEvent;
|
||||||
@ -34,6 +35,8 @@ type
|
|||||||
FExitCode: DWord;
|
FExitCode: DWord;
|
||||||
FPDEvent: TFPDEvent;
|
FPDEvent: TFPDEvent;
|
||||||
FParams: TStringList;
|
FParams: TStringList;
|
||||||
|
FWorkingDirectory: string;
|
||||||
|
procedure SetEnvironment(AValue: TStrings);
|
||||||
procedure SetExecutableFilename(AValue: string);
|
procedure SetExecutableFilename(AValue: string);
|
||||||
procedure SetOnLog(AValue: TOnLog);
|
procedure SetOnLog(AValue: TOnLog);
|
||||||
procedure DoOnDebugInfoLoaded(Sender: TObject);
|
procedure DoOnDebugInfoLoaded(Sender: TObject);
|
||||||
@ -64,6 +67,8 @@ type
|
|||||||
property CurrentProcess: TDbgProcess read FCurrentProcess;
|
property CurrentProcess: TDbgProcess read FCurrentProcess;
|
||||||
property MainProcess: TDbgProcess read FMainProcess;
|
property MainProcess: TDbgProcess read FMainProcess;
|
||||||
property Params: TStringList read FParams write SetParams;
|
property Params: TStringList read FParams write SetParams;
|
||||||
|
property Environment: TStrings read FEnvironment write SetEnvironment;
|
||||||
|
property WorkingDirectory: string read FWorkingDirectory write FWorkingDirectory;
|
||||||
|
|
||||||
property OnCreateProcessEvent: TOnCreateProcessEvent read FOnCreateProcessEvent write FOnCreateProcessEvent;
|
property OnCreateProcessEvent: TOnCreateProcessEvent read FOnCreateProcessEvent write FOnCreateProcessEvent;
|
||||||
property OnHitBreakpointEvent: TOnHitBreakpointEvent read FOnHitBreakpointEvent write FOnHitBreakpointEvent;
|
property OnHitBreakpointEvent: TOnHitBreakpointEvent read FOnHitBreakpointEvent write FOnHitBreakpointEvent;
|
||||||
@ -94,6 +99,12 @@ begin
|
|||||||
FExecutableFilename:=AValue;
|
FExecutableFilename:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TDbgController.SetEnvironment(AValue: TStrings);
|
||||||
|
begin
|
||||||
|
if FEnvironment=AValue then Exit;
|
||||||
|
FEnvironment.Assign(AValue);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDbgController.SetOnLog(AValue: TOnLog);
|
procedure TDbgController.SetOnLog(AValue: TOnLog);
|
||||||
begin
|
begin
|
||||||
if FOnLog=AValue then Exit;
|
if FOnLog=AValue then Exit;
|
||||||
@ -106,6 +117,7 @@ destructor TDbgController.Destroy;
|
|||||||
begin
|
begin
|
||||||
//FCurrentProcess.Free;
|
//FCurrentProcess.Free;
|
||||||
FParams.Free;
|
FParams.Free;
|
||||||
|
FEnvironment.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -130,7 +142,7 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
FCurrentProcess := OSDbgClasses.DbgProcessClass.StartInstance(FExecutableFilename, FParams);
|
FCurrentProcess := OSDbgClasses.DbgProcessClass.StartInstance(FExecutableFilename, Params, Environment, WorkingDirectory);
|
||||||
if assigned(FCurrentProcess) then
|
if assigned(FCurrentProcess) then
|
||||||
begin
|
begin
|
||||||
FCurrentProcess.OnDebugInfoLoaded := @DoOnDebugInfoLoaded;
|
FCurrentProcess.OnDebugInfoLoaded := @DoOnDebugInfoLoaded;
|
||||||
@ -332,6 +344,7 @@ end;
|
|||||||
constructor TDbgController.Create;
|
constructor TDbgController.Create;
|
||||||
begin
|
begin
|
||||||
FParams := TStringList.Create;
|
FParams := TStringList.Create;
|
||||||
|
FEnvironment := TStringList.Create;
|
||||||
FProcessMap := TMap.Create(itu4, SizeOf(TDbgProcess));
|
FProcessMap := TMap.Create(itu4, SizeOf(TDbgProcess));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ type
|
|||||||
protected
|
protected
|
||||||
function InitializeLoader: TDbgImageLoader; override;
|
function InitializeLoader: TDbgImageLoader; override;
|
||||||
public
|
public
|
||||||
class function StartInstance(AFileName: string; AParams: TStringList): TDbgProcess; override;
|
class function StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess; override;
|
||||||
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); override;
|
constructor Create(const AName: string; const AProcessID, AThreadID: Integer); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
|
||||||
@ -290,7 +290,7 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TDbgDarwinProcess.StartInstance(AFileName: string; AParams: TStringList): TDbgProcess;
|
class function TDbgDarwinProcess.StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess;
|
||||||
var
|
var
|
||||||
PID: TPid;
|
PID: TPid;
|
||||||
stat: longint;
|
stat: longint;
|
||||||
@ -321,6 +321,8 @@ begin
|
|||||||
AProcess.OnForkEvent:=@OnForkEvent;
|
AProcess.OnForkEvent:=@OnForkEvent;
|
||||||
AProcess.Executable:=AnExecutabeFilename;
|
AProcess.Executable:=AnExecutabeFilename;
|
||||||
AProcess.Parameters:=AParams;
|
AProcess.Parameters:=AParams;
|
||||||
|
AProcess.Environment:=AnEnvironment;
|
||||||
|
AProcess.CurrentDirectory:=AWorkingDirectory;
|
||||||
AProcess.Execute;
|
AProcess.Execute;
|
||||||
PID:=AProcess.ProcessID;
|
PID:=AProcess.ProcessID;
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ type
|
|||||||
procedure Interrupt;
|
procedure Interrupt;
|
||||||
function HandleDebugEvent(const ADebugEvent: TDebugEvent): Boolean;
|
function HandleDebugEvent(const ADebugEvent: TDebugEvent): Boolean;
|
||||||
|
|
||||||
class function StartInstance(AFileName: string; AParams: TStringList): TDbgProcess; override;
|
class function StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess; override;
|
||||||
function Continue(AProcess: TDbgProcess; AThread: TDbgThread): boolean; override;
|
function Continue(AProcess: TDbgProcess; AThread: TDbgThread): boolean; override;
|
||||||
function WaitForDebugEvent(out ProcessIdentifier, ThreadIdentifier: THandle): boolean; override;
|
function WaitForDebugEvent(out ProcessIdentifier, ThreadIdentifier: THandle): boolean; override;
|
||||||
function ResolveDebugEvent(AThread: TDbgThread): TFPDEvent; override;
|
function ResolveDebugEvent(AThread: TDbgThread): TFPDEvent; override;
|
||||||
@ -398,7 +398,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TDbgWinProcess.StartInstance(AFileName: string; AParams: TStringList): TDbgProcess;
|
class function TDbgWinProcess.StartInstance(AFileName: string; AParams, AnEnvironment: TStrings; AWorkingDirectory: string): TDbgProcess;
|
||||||
var
|
var
|
||||||
AProcess: TProcess;
|
AProcess: TProcess;
|
||||||
begin
|
begin
|
||||||
@ -407,6 +407,8 @@ begin
|
|||||||
AProcess.Options:=[poDebugProcess, poNewProcessGroup];
|
AProcess.Options:=[poDebugProcess, poNewProcessGroup];
|
||||||
AProcess.Executable:=AFilename;
|
AProcess.Executable:=AFilename;
|
||||||
AProcess.Parameters:=AParams;
|
AProcess.Parameters:=AParams;
|
||||||
|
AProcess.Environment:=AnEnvironment;
|
||||||
|
AProcess.CurrentDirectory:=AWorkingDirectory;
|
||||||
AProcess.Execute;
|
AProcess.Execute;
|
||||||
|
|
||||||
result := TDbgWinProcess.Create(AFileName, AProcess.ProcessID, AProcess.ThreadID);
|
result := TDbgWinProcess.Create(AFileName, AProcess.ProcessID, AProcess.ThreadID);
|
||||||
|
@ -862,6 +862,8 @@ begin
|
|||||||
FDbgController.Params.Clear;
|
FDbgController.Params.Clear;
|
||||||
if Arguments<>'' then
|
if Arguments<>'' then
|
||||||
CommandToList(Arguments, FDbgController.Params);
|
CommandToList(Arguments, FDbgController.Params);
|
||||||
|
FDbgController.WorkingDirectory:=WorkingDir;
|
||||||
|
FDbgController.Environment:=Environment;
|
||||||
FFpDebugThread := TFpDebugThread.Create(Self);
|
FFpDebugThread := TFpDebugThread.Create(Self);
|
||||||
RTLeventWaitFor(FFpDebugThread.DebugLoopStoppedEvent);
|
RTLeventWaitFor(FFpDebugThread.DebugLoopStoppedEvent);
|
||||||
RTLeventResetEvent(FFpDebugThread.DebugLoopStoppedEvent);
|
RTLeventResetEvent(FFpDebugThread.DebugLoopStoppedEvent);
|
||||||
|
Loading…
Reference in New Issue
Block a user