From d69dbdadfb964595bb58059d9956e3f5a55fde8f Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 22 Jun 2018 23:35:56 +0000 Subject: [PATCH] LeakView: valgrind parser git-svn-id: trunk@58384 - --- components/leakview/leakinfo.pas | 43 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/components/leakview/leakinfo.pas b/components/leakview/leakinfo.pas index f2de5cbcf2..b909610d2f 100644 --- a/components/leakview/leakinfo.pas +++ b/components/leakview/leakinfo.pas @@ -113,7 +113,7 @@ type fParsed : Boolean; function PosInTrc(const SubStr: string; CaseSensetive: Boolean = false): Boolean; - function IsTraceLine(const SubStr: string; CheckOnlyLineStart: Boolean = False): Boolean; + function IsTraceLine(const Idx: Integer; CheckOnlyLineStart: Boolean = False): Boolean; function IsHeaderLine(Idx: integer; NoneStrict: Boolean = False): Boolean; function TrcNumberAfter(var Num: Int64; const AfterSub: string): Boolean; function TrcNumberAfter(var Num: Integer; const AfterSub: string): Boolean; @@ -283,7 +283,7 @@ begin Result := Pos(UpperCase(SubStr), UpperCase(Trc[TrcIndex]))>0; end; -function IsValgrindLine(s: String): Boolean; +function IsValgrindLine(s: String; CheckEmpty: Boolean = false): Boolean; var i: Integer; begin @@ -291,8 +291,14 @@ begin if pos('==', s) <> 1 then exit; i := 3; while (i<=Length(s)) and (s[i] in ['0'..'9']) do inc(i); - if (i+2 < Length(s)) and (s[i] = '=') and (s[i+1] = '=') and (s[i+2] = ' ') then + if (i+2 <= Length(s)) and (s[i] = '=') and (s[i+1] = '=') and (s[i+2] = ' ') then Result := true; + + if CheckEmpty then begin + i := i + 3; + while (i<=Length(s)) and (s[i] in [' ', #9, #10, #13]) do inc(i); + if i < Length(s) then Result := False; + end; end; function IsValgrindTraceLine(s: String; RequireAT: boolean = false): Boolean; @@ -314,7 +320,8 @@ begin Result := true; end; -function THeapTrcInfo.IsTraceLine(const SubStr: string; CheckOnlyLineStart: Boolean): Boolean; +function THeapTrcInfo.IsTraceLine(const Idx: Integer; + CheckOnlyLineStart: Boolean): Boolean; function IsGDBLine(s: string): boolean; begin @@ -333,8 +340,9 @@ function THeapTrcInfo.IsTraceLine(const SubStr: string; CheckOnlyLineStart: Bool var i, l: integer; - s: String; + s, SubStr: String; begin + SubStr := Trc[Idx]; Result := False; s := Trim(SubStr); @@ -357,8 +365,9 @@ begin Result := true; end else if pos('frame #', s) > 0 then begin Result := True; - end else if IsValgrindTraceLine(s) then begin - Result := True; + end else if IsValgrindLine(s) then begin + Result := IsValgrindTraceLine(s) or + ( (Idx > 0) and (Idx < Trc.Count-1) and IsValgrindTraceLine(Trc[Idx-1]) and IsValgrindTraceLine(Trc[Idx+1]) ); end else begin // heaptrc line? i := 1; @@ -381,7 +390,10 @@ var SubStr: String; begin SubStr := Trc[Idx]; - if (pos('==', SubStr) = 1) and (Idx