From b5f20a389fe3f578d6c492838e5d9c5fb4da54cd Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 2 May 2019 01:05:07 +0000 Subject: [PATCH] LeakView: Use FpDebug to resolve traces without lines git-svn-id: trunk@61105 - --- components/leakview/leakinfo.pas | 58 ++++++++++++++++++++++++++++++-- components/leakview/leakview.lpk | 14 ++++---- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/components/leakview/leakinfo.pas b/components/leakview/leakinfo.pas index 70b028136c..2bf6115873 100644 --- a/components/leakview/leakinfo.pas +++ b/components/leakview/leakinfo.pas @@ -11,11 +11,15 @@ uses // CodeTools CodeToolManager, CodeCache, // LazUtils - FileUtil, LazFileUtils, LazClasses, + FileUtil, LazFileUtils, LazClasses, LazLoggerBase, // IDEIntf TextTools, // LeakView - DbgInfoReader, DbgIntfBaseTypes, LldbHelper; + {$IFDEF LEAK_RESOLVE_USE_FPC} + DbgInfoReader, + {$ENDIF} + DbgIntfBaseTypes, FpDbgLoader, FpDbgDwarf, FpDbgInfo, + LldbHelper; type { TStackLine } @@ -862,18 +866,47 @@ begin end; 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 trace: TStackTrace; i, j, k: Integer; CurLine: TStackLine; + {$IFDEF LEAK_RESOLVE_USE_FPC} FuncName, SrcName: shortstring; SrcLine: longint; + {$ENDIF} BadAddresses: TStackLines; + sym: TFpDbgSymbol; begin Result := False; + {$IFDEF LEAK_RESOLVE_USE_FPC} if not OpenSymbolFile(AFileName) then exit; + {$ELSE} + LoadDwarf; + {$ENDIF} BadAddresses := TStackLines.Create; + if DwarfInfo = nil then + exit; try for i := 0 to Traces.Count - 1 do begin trace := TStackTrace(Traces[i]); @@ -884,21 +917,40 @@ begin if k >= 0 then CurLine.Assign(FKnownAddresses.Lines[k]) 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 CurLine.FileName := SrcName; CurLine.LineNum := SrcLine; FKnownAddresses.Add(CurLine); 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 BadAddresses.Add(CurLine); end; + {$IFnDEF LEAK_RESOLVE_USE_FPC} + ReleaseRefAndNil(sym); + {$ENDIF} end; end; end; end; finally + {$IFDEF LEAK_RESOLVE_USE_FPC} CloseSymbolFile; + {$ELSE} + UnLoadDwarf; + {$ENDIF} FreeAndNil(BadAddresses); Result := True; end; diff --git a/components/leakview/leakview.lpk b/components/leakview/leakview.lpk index a4000628f5..d7a23385c3 100644 --- a/components/leakview/leakview.lpk +++ b/components/leakview/leakview.lpk @@ -5,7 +5,7 @@ - + @@ -53,23 +53,25 @@ - + - + - + - + + + + -