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:
martin 2019-03-10 17:59:59 +00:00
parent db921aff87
commit 8e825867ba
3 changed files with 71 additions and 12 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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"