mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-28 03:37:36 +01:00
LeakView: Use FpDebug to resolve traces without lines
git-svn-id: trunk@61105 -
This commit is contained in:
parent
4544b99ea8
commit
b5f20a389f
@ -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;
|
||||||
|
|||||||
@ -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 'skalogryz' 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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user