LeakView: Use FpDebug to resolve traces without lines

git-svn-id: trunk@61105 -
This commit is contained in:
martin 2019-05-02 01:05:07 +00:00
parent 4544b99ea8
commit b5f20a389f
2 changed files with 63 additions and 9 deletions

View File

@ -11,11 +11,15 @@ uses
// CodeTools // CodeTools
CodeToolManager, CodeCache, CodeToolManager, CodeCache,
// LazUtils // LazUtils
FileUtil, LazFileUtils, LazClasses, FileUtil, LazFileUtils, LazClasses, LazLoggerBase,
// IDEIntf // IDEIntf
TextTools, TextTools,
// LeakView // LeakView
DbgInfoReader, DbgIntfBaseTypes, LldbHelper; {$IFDEF LEAK_RESOLVE_USE_FPC}
DbgInfoReader,
{$ENDIF}
DbgIntfBaseTypes, FpDbgLoader, FpDbgDwarf, FpDbgInfo,
LldbHelper;
type type
{ TStackLine } { TStackLine }
@ -862,18 +866,47 @@ begin
end; end;
function THeapTrcInfo.ResolveLeakInfo(AFileName: string; Traces: TList): Boolean; function THeapTrcInfo.ResolveLeakInfo(AFileName: string; Traces: TList): Boolean;
var
DwarfInfo: TFpDwarfInfo;
ImageLoaderList: TDbgImageLoaderList;
procedure UnLoadDwarf;
begin
FreeAndNil(DwarfInfo);
FreeAndNil(ImageLoaderList);
end;
procedure LoadDwarf;
var
ImageLoader: TDbgImageLoader;
begin
ImageLoader := TDbgImageLoader.Create(AFileName);
ImageLoaderList := TDbgImageLoaderList.Create(True);
ImageLoader.AddToLoaderList(ImageLoaderList);
DwarfInfo := TFpDwarfInfo.Create(ImageLoaderList);
DwarfInfo.LoadCompilationUnits;
end;
var var
trace: TStackTrace; trace: TStackTrace;
i, j, k: Integer; i, j, k: Integer;
CurLine: TStackLine; CurLine: TStackLine;
{$IFDEF LEAK_RESOLVE_USE_FPC}
FuncName, SrcName: shortstring; FuncName, SrcName: shortstring;
SrcLine: longint; SrcLine: longint;
{$ENDIF}
BadAddresses: TStackLines; BadAddresses: TStackLines;
sym: TFpDbgSymbol;
begin begin
Result := False; Result := False;
{$IFDEF LEAK_RESOLVE_USE_FPC}
if not OpenSymbolFile(AFileName) then if not OpenSymbolFile(AFileName) then
exit; exit;
{$ELSE}
LoadDwarf;
{$ENDIF}
BadAddresses := TStackLines.Create; BadAddresses := TStackLines.Create;
if DwarfInfo = nil then
exit;
try try
for i := 0 to Traces.Count - 1 do begin for i := 0 to Traces.Count - 1 do begin
trace := TStackTrace(Traces[i]); trace := TStackTrace(Traces[i]);
@ -884,21 +917,40 @@ begin
if k >= 0 then if k >= 0 then
CurLine.Assign(FKnownAddresses.Lines[k]) CurLine.Assign(FKnownAddresses.Lines[k])
else else
if BadAddresses.IndexOfAddr(CurLine.Addr) < 0 then begin if (BadAddresses.IndexOfAddr(CurLine.Addr) < 0) and (CurLine.Addr > 0) then begin
{$IFDEF LEAK_RESOLVE_USE_FPC}
if GetLineInfo(CurLine.Addr, FuncName, SrcName, SrcLine) then begin if GetLineInfo(CurLine.Addr, FuncName, SrcName, SrcLine) then begin
CurLine.FileName := SrcName; CurLine.FileName := SrcName;
CurLine.LineNum := SrcLine; CurLine.LineNum := SrcLine;
FKnownAddresses.Add(CurLine); FKnownAddresses.Add(CurLine);
end end
{$ELSE}
if j > 0 then
sym := DwarfInfo.FindSymbol(CurLine.Addr - 1 + ImageLoaderList.ImageBase)
else
sym := DwarfInfo.FindSymbol(CurLine.Addr + ImageLoaderList.ImageBase);
if (sym <> nil) and (sym.Line > 0) then begin
CurLine.FileName := sym.FileName;
CurLine.LineNum := sym.Line;
FKnownAddresses.Add(CurLine);
end
{$ENDIF}
else begin else begin
BadAddresses.Add(CurLine); BadAddresses.Add(CurLine);
end; end;
{$IFnDEF LEAK_RESOLVE_USE_FPC}
ReleaseRefAndNil(sym);
{$ENDIF}
end; end;
end; end;
end; end;
end; end;
finally finally
{$IFDEF LEAK_RESOLVE_USE_FPC}
CloseSymbolFile; CloseSymbolFile;
{$ELSE}
UnLoadDwarf;
{$ENDIF}
FreeAndNil(BadAddresses); FreeAndNil(BadAddresses);
Result := True; Result := True;
end; end;

View File

@ -5,7 +5,7 @@
<Name Value="leakview"/> <Name Value="leakview"/>
<Type Value="RunAndDesignTime"/> <Type Value="RunAndDesignTime"/>
<AddToProjectUsesSection Value="True"/> <AddToProjectUsesSection Value="True"/>
<Author Value="Dmitry 'skalogryz' Boyarintsev"/> <Author Value="Dmitry &apos;skalogryz&apos; Boyarintsev"/>
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
@ -53,23 +53,25 @@
<EnableI18N Value="True"/> <EnableI18N Value="True"/>
<OutDir Value="languages"/> <OutDir Value="languages"/>
</i18n> </i18n>
<RequiredPkgs Count="3"> <RequiredPkgs Count="4">
<Item1> <Item1>
<PackageName Value="LazDebuggerLldb"/> <PackageName Value="fpdebug"/>
</Item1> </Item1>
<Item2> <Item2>
<PackageName Value="CodeTools"/> <PackageName Value="LazDebuggerLldb"/>
</Item2> </Item2>
<Item3> <Item3>
<PackageName Value="IDEIntf"/> <PackageName Value="CodeTools"/>
</Item3> </Item3>
<Item4>
<PackageName Value="IDEIntf"/>
</Item4>
</RequiredPkgs> </RequiredPkgs>
<UsageOptions> <UsageOptions>
<UnitPath Value="$(PkgOutDir)"/> <UnitPath Value="$(PkgOutDir)"/>
</UsageOptions> </UsageOptions>
<PublishOptions> <PublishOptions>
<Version Value="2"/> <Version Value="2"/>
<IgnoreBinaries Value="False"/>
</PublishOptions> </PublishOptions>
</Package> </Package>
</CONFIG> </CONFIG>