mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-20 10:39:09 +02:00
LazDebugger(Fp)Lldb: Errors during launch may be warnings (e.g. outdated debug info). Report to user, and allow to ignore.
git-svn-id: trunk@60649 -
This commit is contained in:
parent
db921aff87
commit
8e825867ba
@ -96,6 +96,7 @@ type
|
|||||||
FDwarfInfo: TFpDwarfInfo;
|
FDwarfInfo: TFpDwarfInfo;
|
||||||
FMemReader: TFpLldbDbgMemReader;
|
FMemReader: TFpLldbDbgMemReader;
|
||||||
FMemManager: TFpDbgMemManager;
|
FMemManager: TFpDbgMemManager;
|
||||||
|
FReaderErrors: String;
|
||||||
public
|
public
|
||||||
procedure Execute; override;
|
procedure Execute; override;
|
||||||
constructor Create(AFileName: String; ADebugger: TFpLldbDebugger);
|
constructor Create(AFileName: String; ADebugger: TFpLldbDebugger);
|
||||||
@ -106,6 +107,7 @@ type
|
|||||||
property DwarfInfo: TFpDwarfInfo read FDwarfInfo;
|
property DwarfInfo: TFpDwarfInfo read FDwarfInfo;
|
||||||
property MemReader: TFpLldbDbgMemReader read FMemReader;
|
property MemReader: TFpLldbDbgMemReader read FMemReader;
|
||||||
property MemManager: TFpDbgMemManager read FMemManager;
|
property MemManager: TFpDbgMemManager read FMemManager;
|
||||||
|
property ReaderErrors: String read FReaderErrors;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
@ -129,13 +131,14 @@ type
|
|||||||
procedure DoEndReceivingLines(Sender: TObject);
|
procedure DoEndReceivingLines(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoBeforeLaunch; override;
|
procedure DoBeforeLaunch; override;
|
||||||
|
procedure DoAfterLaunch(var LaunchWarnings: string); override;
|
||||||
function CreateLineInfo: TDBGLineInfo; override;
|
function CreateLineInfo: TDBGLineInfo; override;
|
||||||
function CreateWatches: TWatchesSupplier; override;
|
function CreateWatches: TWatchesSupplier; override;
|
||||||
function CreateLocals: TLocalsSupplier; override;
|
function CreateLocals: TLocalsSupplier; override;
|
||||||
function CreateDisassembler: TDBGDisassembler; override;
|
function CreateDisassembler: TDBGDisassembler; override;
|
||||||
procedure DoState(const OldState: TDBGState); override;
|
procedure DoState(const OldState: TDBGState); override;
|
||||||
function HasDwarf: Boolean;
|
function HasDwarf: Boolean;
|
||||||
procedure LoadDwarf;
|
function LoadDwarf: String;
|
||||||
procedure UnLoadDwarf;
|
procedure UnLoadDwarf;
|
||||||
function RequestCommand(const ACommand: TDBGCommand;
|
function RequestCommand(const ACommand: TDBGCommand;
|
||||||
const AParams: array of const;
|
const AParams: array of const;
|
||||||
@ -299,6 +302,7 @@ begin
|
|||||||
|
|
||||||
FImageLoaderList := TDbgImageLoaderList.Create(True);
|
FImageLoaderList := TDbgImageLoaderList.Create(True);
|
||||||
AnImageLoader.AddToLoaderList(FImageLoaderList);
|
AnImageLoader.AddToLoaderList(FImageLoaderList);
|
||||||
|
FReaderErrors := AnImageLoader.ReaderErrors;
|
||||||
if Terminated then
|
if Terminated then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
@ -1047,14 +1051,7 @@ var
|
|||||||
begin
|
begin
|
||||||
inherited DoState(OldState);
|
inherited DoState(OldState);
|
||||||
if State in [dsStop, dsError, dsNone] then
|
if State in [dsStop, dsError, dsNone] then
|
||||||
UnLoadDwarf
|
UnLoadDwarf;
|
||||||
else
|
|
||||||
if (State = dsRun) and (OldState = dsInit) then begin
|
|
||||||
LoadDwarf;
|
|
||||||
{$IFdef WithWinMemReader}
|
|
||||||
TFpLldbAndWin32DbgMemReader(FMemReader).OpenProcess(TargetPid);
|
|
||||||
{$ENDIF}
|
|
||||||
end;
|
|
||||||
|
|
||||||
if OldState in [dsPause, dsInternalPause] then begin
|
if OldState in [dsPause, dsInternalPause] then begin
|
||||||
for i := 0 to MAX_CTX_CACHE-1 do
|
for i := 0 to MAX_CTX_CACHE-1 do
|
||||||
@ -1067,7 +1064,7 @@ begin
|
|||||||
FWatchEvalList.Clear;
|
FWatchEvalList.Clear;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if (State = dsRun) then
|
if (State = dsRun) and (FMemManager <> nil) then
|
||||||
TFpLldbDbgMemCacheManagerSimple(FMemManager.CacheManager).Clear;
|
TFpLldbDbgMemCacheManagerSimple(FMemManager.CacheManager).Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1076,11 +1073,12 @@ begin
|
|||||||
Result := FDwarfInfo <> nil;
|
Result := FDwarfInfo <> nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpLldbDebugger.LoadDwarf;
|
function TFpLldbDebugger.LoadDwarf: String;
|
||||||
var
|
var
|
||||||
AnImageLoader: TDbgImageLoader;
|
AnImageLoader: TDbgImageLoader;
|
||||||
Loader: TDwarfLoaderThread;
|
Loader: TDwarfLoaderThread;
|
||||||
begin
|
begin
|
||||||
|
Result := ''; // no errors/warnings
|
||||||
Loader := FDwarfLoaderThread;
|
Loader := FDwarfLoaderThread;
|
||||||
FDwarfLoaderThread := nil;
|
FDwarfLoaderThread := nil;
|
||||||
|
|
||||||
@ -1093,6 +1091,7 @@ begin
|
|||||||
FMemReader := Loader.MemReader;
|
FMemReader := Loader.MemReader;
|
||||||
FMemManager := Loader.MemManager;
|
FMemManager := Loader.MemManager;
|
||||||
FDwarfInfo := Loader.DwarfInfo;
|
FDwarfInfo := Loader.DwarfInfo;
|
||||||
|
Result := Loader.ReaderErrors;
|
||||||
Loader.Free;
|
Loader.Free;
|
||||||
|
|
||||||
if FDwarfInfo.Image64Bit then
|
if FDwarfInfo.Image64Bit then
|
||||||
@ -1110,6 +1109,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
FImageLoaderList := TDbgImageLoaderList.Create(True);
|
FImageLoaderList := TDbgImageLoaderList.Create(True);
|
||||||
AnImageLoader.AddToLoaderList(FImageLoaderList);
|
AnImageLoader.AddToLoaderList(FImageLoaderList);
|
||||||
|
Result := AnImageLoader.ReaderErrors;
|
||||||
{$IFdef WithWinMemReader}
|
{$IFdef WithWinMemReader}
|
||||||
FMemReader := TFpLldbAndWin32DbgMemReader.Create(Self);
|
FMemReader := TFpLldbAndWin32DbgMemReader.Create(Self);
|
||||||
{$Else}
|
{$Else}
|
||||||
@ -1529,6 +1529,15 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TFpLldbDebugger.DoAfterLaunch(var LaunchWarnings: string);
|
||||||
|
begin
|
||||||
|
inherited DoAfterLaunch(LaunchWarnings);
|
||||||
|
LaunchWarnings := LaunchWarnings + LoadDwarf;
|
||||||
|
{$IFdef WithWinMemReader}
|
||||||
|
TFpLldbAndWin32DbgMemReader(FMemReader).OpenProcess(TargetPid);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpLldbDebugger.CreateLineInfo: TDBGLineInfo;
|
function TFpLldbDebugger.CreateLineInfo: TDBGLineInfo;
|
||||||
begin
|
begin
|
||||||
Result := TFpLldbLineInfo.Create(Self);
|
Result := TFpLldbLineInfo.Create(Self);
|
||||||
|
@ -166,6 +166,7 @@ type
|
|||||||
private
|
private
|
||||||
FRunInstr: TLldbInstruction;
|
FRunInstr: TLldbInstruction;
|
||||||
procedure ExceptBreakInstructionFinished(Sender: TObject);
|
procedure ExceptBreakInstructionFinished(Sender: TObject);
|
||||||
|
procedure LaunchInstructionSucceeded(Sender: TObject);
|
||||||
procedure TargetCreated(Sender: TObject);
|
procedure TargetCreated(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoInitialExecute; override;
|
procedure DoInitialExecute; override;
|
||||||
@ -269,12 +270,14 @@ type
|
|||||||
private
|
private
|
||||||
FLaunchNewTerminal: Boolean;
|
FLaunchNewTerminal: Boolean;
|
||||||
FSkipGDBDetection: Boolean;
|
FSkipGDBDetection: Boolean;
|
||||||
|
FIgnoreLaunchWarnings: Boolean;
|
||||||
public
|
public
|
||||||
constructor Create; override;
|
constructor Create; override;
|
||||||
procedure Assign(Source: TPersistent); override;
|
procedure Assign(Source: TPersistent); override;
|
||||||
published
|
published
|
||||||
property LaunchNewTerminal: Boolean read FLaunchNewTerminal write FLaunchNewTerminal default False;
|
property LaunchNewTerminal: Boolean read FLaunchNewTerminal write FLaunchNewTerminal default False;
|
||||||
property SkipGDBDetection: Boolean read FSkipGDBDetection write FSkipGDBDetection default False;
|
property SkipGDBDetection: Boolean read FSkipGDBDetection write FSkipGDBDetection default False;
|
||||||
|
property IgnoreLaunchWarnings: Boolean read FIgnoreLaunchWarnings write FIgnoreLaunchWarnings default False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TLldbDebugger = class(TDebuggerIntf)
|
TLldbDebugger = class(TDebuggerIntf)
|
||||||
@ -316,6 +319,7 @@ type
|
|||||||
procedure TerminateLldb; // Kills external debugger
|
procedure TerminateLldb; // Kills external debugger
|
||||||
protected
|
protected
|
||||||
procedure DoBeforeLaunch; virtual;
|
procedure DoBeforeLaunch; virtual;
|
||||||
|
procedure DoAfterLaunch(var LaunchWarnings: string); virtual;
|
||||||
procedure DoBeginReceivingLines(Sender: TObject);
|
procedure DoBeginReceivingLines(Sender: TObject);
|
||||||
procedure DoEndReceivingLines(Sender: TObject);
|
procedure DoEndReceivingLines(Sender: TObject);
|
||||||
procedure LockRelease; override;
|
procedure LockRelease; override;
|
||||||
@ -533,6 +537,7 @@ begin
|
|||||||
inherited Create;
|
inherited Create;
|
||||||
FLaunchNewTerminal := False;
|
FLaunchNewTerminal := False;
|
||||||
FSkipGDBDetection := False;
|
FSkipGDBDetection := False;
|
||||||
|
FIgnoreLaunchWarnings := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TLldbDebuggerProperties.Assign(Source: TPersistent);
|
procedure TLldbDebuggerProperties.Assign(Source: TPersistent);
|
||||||
@ -540,6 +545,7 @@ begin
|
|||||||
inherited Assign(Source);
|
inherited Assign(Source);
|
||||||
FLaunchNewTerminal := TLldbDebuggerProperties(Source).FLaunchNewTerminal;
|
FLaunchNewTerminal := TLldbDebuggerProperties(Source).FLaunchNewTerminal;
|
||||||
FSkipGDBDetection := TLldbDebuggerProperties(Source).FSkipGDBDetection;
|
FSkipGDBDetection := TLldbDebuggerProperties(Source).FSkipGDBDetection;
|
||||||
|
FIgnoreLaunchWarnings := TLldbDebuggerProperties(Source).FIgnoreLaunchWarnings;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TLldbDebuggerCommandRun }
|
{ TLldbDebuggerCommandRun }
|
||||||
@ -2383,12 +2389,39 @@ begin
|
|||||||
// the state change allows breakpoints to be set, before the run command is issued.
|
// the state change allows breakpoints to be set, before the run command is issued.
|
||||||
|
|
||||||
FRunInstr := TLldbInstructionProcessLaunch.Create(TLldbDebuggerProperties(Debugger.GetProperties).LaunchNewTerminal);
|
FRunInstr := TLldbInstructionProcessLaunch.Create(TLldbDebuggerProperties(Debugger.GetProperties).LaunchNewTerminal);
|
||||||
FRunInstr.OnSuccess := @RunInstructionSucceeded;
|
FRunInstr.OnSuccess := @LaunchInstructionSucceeded;
|
||||||
FRunInstr.OnFailure := @InstructionFailed;
|
FRunInstr.OnFailure := @InstructionFailed;
|
||||||
QueueInstruction(FRunInstr);
|
QueueInstruction(FRunInstr);
|
||||||
FRunInstr.ReleaseReference;
|
FRunInstr.ReleaseReference;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TLldbDebuggerCommandRunLaunch.LaunchInstructionSucceeded(Sender: TObject);
|
||||||
|
var
|
||||||
|
LaunchWarnings: String;
|
||||||
|
begin
|
||||||
|
LaunchWarnings := TLldbInstructionProcessLaunch(Sender).Errors;
|
||||||
|
Debugger.DoAfterLaunch(LaunchWarnings);
|
||||||
|
if (not TLldbDebuggerProperties(Debugger.GetProperties).IgnoreLaunchWarnings) and
|
||||||
|
(LaunchWarnings <> '') and
|
||||||
|
assigned(Debugger.OnFeedback)
|
||||||
|
then begin
|
||||||
|
case Debugger.OnFeedback(self,
|
||||||
|
Format('The debugger encountered some errors/warnings while launching the target application.%0:s'
|
||||||
|
+ 'Press "Ok" to continue debugging.%0:s'
|
||||||
|
+ 'Press "Stop" to end the debug session.',
|
||||||
|
[LineEnding]),
|
||||||
|
LaunchWarnings, ftWarning, [frOk, frStop]
|
||||||
|
) of
|
||||||
|
frOk: begin
|
||||||
|
end;
|
||||||
|
frStop: begin
|
||||||
|
Debugger.Stop;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
RunInstructionSucceeded(Sender);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TLldbDebuggerCommandRunLaunch.DoInitialExecute;
|
procedure TLldbDebuggerCommandRunLaunch.DoInitialExecute;
|
||||||
var
|
var
|
||||||
Instr: TLldbInstruction;
|
Instr: TLldbInstruction;
|
||||||
@ -2756,6 +2789,11 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TLldbDebugger.DoAfterLaunch(var LaunchWarnings: string);
|
||||||
|
begin
|
||||||
|
//
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TLldbDebugger.LockRelease;
|
procedure TLldbDebugger.LockRelease;
|
||||||
begin
|
begin
|
||||||
inherited LockRelease;
|
inherited LockRelease;
|
||||||
|
@ -119,10 +119,13 @@ type
|
|||||||
{ TLldbInstructionProcessLaunch }
|
{ TLldbInstructionProcessLaunch }
|
||||||
|
|
||||||
TLldbInstructionProcessLaunch = class(TLldbInstruction)
|
TLldbInstructionProcessLaunch = class(TLldbInstruction)
|
||||||
|
private
|
||||||
|
FErrors: String;
|
||||||
protected
|
protected
|
||||||
function ProcessInputFromDbg(const AData: String): Boolean; override;
|
function ProcessInputFromDbg(const AData: String): Boolean; override;
|
||||||
public
|
public
|
||||||
constructor Create(AOpenTerminal: Boolean);
|
constructor Create(AOpenTerminal: Boolean);
|
||||||
|
property Errors: String read FErrors;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TLldbInstructionProcessStep }
|
{ TLldbInstructionProcessStep }
|
||||||
@ -693,6 +696,15 @@ begin
|
|||||||
if StrStartsWith(AData, 'Process ') and (pos(' launched:', AData) > 8) then begin
|
if StrStartsWith(AData, 'Process ') and (pos(' launched:', AData) > 8) then begin
|
||||||
SetContentReceieved;
|
SetContentReceieved;
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
if LeftStr(AData, 7) = 'error: ' then begin
|
||||||
|
if StrContains(LowerCase(AData), 'launch failed') or
|
||||||
|
StrContains(LowerCase(AData), 'process')
|
||||||
|
then
|
||||||
|
Result := inherited
|
||||||
|
else
|
||||||
|
FErrors := FErrors + AData + LineEnding;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
Result := inherited;
|
Result := inherited;
|
||||||
Result := True; // Ignore any "process stopped", before "launched"
|
Result := True; // Ignore any "process stopped", before "launched"
|
||||||
|
Loading…
Reference in New Issue
Block a user