xref: /aosp_15_r20/external/curl/tests/memanalyze.pl (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl
2*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
3*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
4*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
5*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
6*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
7*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
8*6236dae4SAndroid Build Coastguard Worker#
9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
10*6236dae4SAndroid Build Coastguard Worker#
11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
14*6236dae4SAndroid Build Coastguard Worker#
15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
18*6236dae4SAndroid Build Coastguard Worker#
19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
21*6236dae4SAndroid Build Coastguard Worker#
22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
23*6236dae4SAndroid Build Coastguard Worker#
24*6236dae4SAndroid Build Coastguard Worker###########################################################################
25*6236dae4SAndroid Build Coastguard Worker#
26*6236dae4SAndroid Build Coastguard Worker# Example input:
27*6236dae4SAndroid Build Coastguard Worker#
28*6236dae4SAndroid Build Coastguard Worker# MEM mprintf.c:1094 malloc(32) = e5718
29*6236dae4SAndroid Build Coastguard Worker# MEM mprintf.c:1103 realloc(e5718, 64) = e6118
30*6236dae4SAndroid Build Coastguard Worker# MEM sendf.c:232 free(f6520)
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Workermy $mallocs=0;
33*6236dae4SAndroid Build Coastguard Workermy $callocs=0;
34*6236dae4SAndroid Build Coastguard Workermy $reallocs=0;
35*6236dae4SAndroid Build Coastguard Workermy $strdups=0;
36*6236dae4SAndroid Build Coastguard Workermy $wcsdups=0;
37*6236dae4SAndroid Build Coastguard Workermy $showlimit;
38*6236dae4SAndroid Build Coastguard Workermy $sends=0;
39*6236dae4SAndroid Build Coastguard Workermy $recvs=0;
40*6236dae4SAndroid Build Coastguard Workermy $sockets=0;
41*6236dae4SAndroid Build Coastguard Worker
42*6236dae4SAndroid Build Coastguard Workerwhile(1) {
43*6236dae4SAndroid Build Coastguard Worker    if($ARGV[0] eq "-v") {
44*6236dae4SAndroid Build Coastguard Worker        $verbose=1;
45*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
46*6236dae4SAndroid Build Coastguard Worker    }
47*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "-t") {
48*6236dae4SAndroid Build Coastguard Worker        $trace=1;
49*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
50*6236dae4SAndroid Build Coastguard Worker    }
51*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "-l") {
52*6236dae4SAndroid Build Coastguard Worker        # only show what alloc that caused a memlimit failure
53*6236dae4SAndroid Build Coastguard Worker        $showlimit=1;
54*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
55*6236dae4SAndroid Build Coastguard Worker    }
56*6236dae4SAndroid Build Coastguard Worker    else {
57*6236dae4SAndroid Build Coastguard Worker        last;
58*6236dae4SAndroid Build Coastguard Worker    }
59*6236dae4SAndroid Build Coastguard Worker}
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Workermy $memsum; # the total number of memory allocated over the lifetime
62*6236dae4SAndroid Build Coastguard Workermy $maxmem; # the high water mark
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard Workersub newtotal {
65*6236dae4SAndroid Build Coastguard Worker    my ($newtot)=@_;
66*6236dae4SAndroid Build Coastguard Worker    # count a max here
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker    if($newtot > $maxmem) {
69*6236dae4SAndroid Build Coastguard Worker        $maxmem= $newtot;
70*6236dae4SAndroid Build Coastguard Worker    }
71*6236dae4SAndroid Build Coastguard Worker}
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Workermy $file = $ARGV[0];
74*6236dae4SAndroid Build Coastguard Worker
75*6236dae4SAndroid Build Coastguard Workerif(! -f $file) {
76*6236dae4SAndroid Build Coastguard Worker    print "Usage: memanalyze.pl [options] <dump file>\n",
77*6236dae4SAndroid Build Coastguard Worker    "Options:\n",
78*6236dae4SAndroid Build Coastguard Worker    " -l  memlimit failure displayed\n",
79*6236dae4SAndroid Build Coastguard Worker    " -v  Verbose\n",
80*6236dae4SAndroid Build Coastguard Worker    " -t  Trace\n";
81*6236dae4SAndroid Build Coastguard Worker    exit;
82*6236dae4SAndroid Build Coastguard Worker}
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Workeropen(my $fileh, "<", "$file");
85*6236dae4SAndroid Build Coastguard Worker
86*6236dae4SAndroid Build Coastguard Workerif($showlimit) {
87*6236dae4SAndroid Build Coastguard Worker    while(<$fileh>) {
88*6236dae4SAndroid Build Coastguard Worker        if(/^LIMIT.*memlimit$/) {
89*6236dae4SAndroid Build Coastguard Worker            print $_;
90*6236dae4SAndroid Build Coastguard Worker            last;
91*6236dae4SAndroid Build Coastguard Worker        }
92*6236dae4SAndroid Build Coastguard Worker    }
93*6236dae4SAndroid Build Coastguard Worker    close($fileh);
94*6236dae4SAndroid Build Coastguard Worker    exit;
95*6236dae4SAndroid Build Coastguard Worker}
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Workermy $lnum=0;
99*6236dae4SAndroid Build Coastguard Workerwhile(<$fileh>) {
100*6236dae4SAndroid Build Coastguard Worker    chomp $_;
101*6236dae4SAndroid Build Coastguard Worker    $line = $_;
102*6236dae4SAndroid Build Coastguard Worker    $lnum++;
103*6236dae4SAndroid Build Coastguard Worker    if($line =~ /^LIMIT ([^ ]*):(\d*) (.*)/) {
104*6236dae4SAndroid Build Coastguard Worker        # new memory limit test prefix
105*6236dae4SAndroid Build Coastguard Worker        my $i = $3;
106*6236dae4SAndroid Build Coastguard Worker        my ($source, $linenum) = ($1, $2);
107*6236dae4SAndroid Build Coastguard Worker        if($trace && ($i =~ /([^ ]*) reached memlimit/)) {
108*6236dae4SAndroid Build Coastguard Worker            print "LIMIT: $1 returned error at $source:$linenum\n";
109*6236dae4SAndroid Build Coastguard Worker        }
110*6236dae4SAndroid Build Coastguard Worker    }
111*6236dae4SAndroid Build Coastguard Worker    elsif($line =~ /^MEM ([^ ]*):(\d*) (.*)/) {
112*6236dae4SAndroid Build Coastguard Worker        # generic match for the filename+linenumber
113*6236dae4SAndroid Build Coastguard Worker        $source = $1;
114*6236dae4SAndroid Build Coastguard Worker        $linenum = $2;
115*6236dae4SAndroid Build Coastguard Worker        $function = $3;
116*6236dae4SAndroid Build Coastguard Worker
117*6236dae4SAndroid Build Coastguard Worker        if($function =~ /free\((\(nil\)|0x([0-9a-f]*))/) {
118*6236dae4SAndroid Build Coastguard Worker            $addr = $2;
119*6236dae4SAndroid Build Coastguard Worker            if($1 eq "(nil)") {
120*6236dae4SAndroid Build Coastguard Worker                ; # do nothing when free(NULL)
121*6236dae4SAndroid Build Coastguard Worker            }
122*6236dae4SAndroid Build Coastguard Worker            elsif(!exists $sizeataddr{$addr}) {
123*6236dae4SAndroid Build Coastguard Worker                print "FREE ERROR: No memory allocated: $line\n";
124*6236dae4SAndroid Build Coastguard Worker            }
125*6236dae4SAndroid Build Coastguard Worker            elsif(-1 == $sizeataddr{$addr}) {
126*6236dae4SAndroid Build Coastguard Worker                print "FREE ERROR: Memory freed twice: $line\n";
127*6236dae4SAndroid Build Coastguard Worker                print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n";
128*6236dae4SAndroid Build Coastguard Worker            }
129*6236dae4SAndroid Build Coastguard Worker            else {
130*6236dae4SAndroid Build Coastguard Worker                $totalmem -= $sizeataddr{$addr};
131*6236dae4SAndroid Build Coastguard Worker                if($trace) {
132*6236dae4SAndroid Build Coastguard Worker                    print "FREE: malloc at ".$getmem{$addr}." is freed again at $source:$linenum\n";
133*6236dae4SAndroid Build Coastguard Worker                    printf("FREE: %d bytes freed, left allocated: $totalmem bytes\n", $sizeataddr{$addr});
134*6236dae4SAndroid Build Coastguard Worker                }
135*6236dae4SAndroid Build Coastguard Worker
136*6236dae4SAndroid Build Coastguard Worker                newtotal($totalmem);
137*6236dae4SAndroid Build Coastguard Worker                $frees++;
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard Worker                $sizeataddr{$addr}=-1; # set -1 to mark as freed
140*6236dae4SAndroid Build Coastguard Worker                $getmem{$addr}="$source:$linenum";
141*6236dae4SAndroid Build Coastguard Worker
142*6236dae4SAndroid Build Coastguard Worker            }
143*6236dae4SAndroid Build Coastguard Worker        }
144*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /malloc\((\d*)\) = 0x([0-9a-f]*)/) {
145*6236dae4SAndroid Build Coastguard Worker            $size = $1;
146*6236dae4SAndroid Build Coastguard Worker            $addr = $2;
147*6236dae4SAndroid Build Coastguard Worker
148*6236dae4SAndroid Build Coastguard Worker            if($sizeataddr{$addr}>0) {
149*6236dae4SAndroid Build Coastguard Worker                # this means weeeeeirdo
150*6236dae4SAndroid Build Coastguard Worker                print "Mixed debug compile ($source:$linenum at line $lnum), rebuild curl now\n";
151*6236dae4SAndroid Build Coastguard Worker                print "We think $sizeataddr{$addr} bytes are already allocated at that memory address: $addr!\n";
152*6236dae4SAndroid Build Coastguard Worker            }
153*6236dae4SAndroid Build Coastguard Worker
154*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$addr}=$size;
155*6236dae4SAndroid Build Coastguard Worker            $totalmem += $size;
156*6236dae4SAndroid Build Coastguard Worker            $memsum += $size;
157*6236dae4SAndroid Build Coastguard Worker
158*6236dae4SAndroid Build Coastguard Worker            if($trace) {
159*6236dae4SAndroid Build Coastguard Worker                print "MALLOC: malloc($size) at $source:$linenum",
160*6236dae4SAndroid Build Coastguard Worker                " makes totally $totalmem bytes\n";
161*6236dae4SAndroid Build Coastguard Worker            }
162*6236dae4SAndroid Build Coastguard Worker
163*6236dae4SAndroid Build Coastguard Worker            newtotal($totalmem);
164*6236dae4SAndroid Build Coastguard Worker            $mallocs++;
165*6236dae4SAndroid Build Coastguard Worker
166*6236dae4SAndroid Build Coastguard Worker            $getmem{$addr}="$source:$linenum";
167*6236dae4SAndroid Build Coastguard Worker        }
168*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /calloc\((\d*),(\d*)\) = 0x([0-9a-f]*)/) {
169*6236dae4SAndroid Build Coastguard Worker            $size = $1*$2;
170*6236dae4SAndroid Build Coastguard Worker            $addr = $3;
171*6236dae4SAndroid Build Coastguard Worker
172*6236dae4SAndroid Build Coastguard Worker            $arg1 = $1;
173*6236dae4SAndroid Build Coastguard Worker            $arg2 = $2;
174*6236dae4SAndroid Build Coastguard Worker
175*6236dae4SAndroid Build Coastguard Worker            if($sizeataddr{$addr}>0) {
176*6236dae4SAndroid Build Coastguard Worker                # this means weeeeeirdo
177*6236dae4SAndroid Build Coastguard Worker                print "Mixed debug compile, rebuild curl now\n";
178*6236dae4SAndroid Build Coastguard Worker            }
179*6236dae4SAndroid Build Coastguard Worker
180*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$addr}=$size;
181*6236dae4SAndroid Build Coastguard Worker            $totalmem += $size;
182*6236dae4SAndroid Build Coastguard Worker            $memsum += $size;
183*6236dae4SAndroid Build Coastguard Worker
184*6236dae4SAndroid Build Coastguard Worker            if($trace) {
185*6236dae4SAndroid Build Coastguard Worker                print "CALLOC: calloc($arg1,$arg2) at $source:$linenum",
186*6236dae4SAndroid Build Coastguard Worker                " makes totally $totalmem bytes\n";
187*6236dae4SAndroid Build Coastguard Worker            }
188*6236dae4SAndroid Build Coastguard Worker
189*6236dae4SAndroid Build Coastguard Worker            newtotal($totalmem);
190*6236dae4SAndroid Build Coastguard Worker            $callocs++;
191*6236dae4SAndroid Build Coastguard Worker
192*6236dae4SAndroid Build Coastguard Worker            $getmem{$addr}="$source:$linenum";
193*6236dae4SAndroid Build Coastguard Worker        }
194*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /realloc\((\(nil\)|0x([0-9a-f]*)), (\d*)\) = 0x([0-9a-f]*)/) {
195*6236dae4SAndroid Build Coastguard Worker            my ($oldaddr, $newsize, $newaddr) = ($2, $3, $4);
196*6236dae4SAndroid Build Coastguard Worker
197*6236dae4SAndroid Build Coastguard Worker            $totalmem -= $sizeataddr{$oldaddr};
198*6236dae4SAndroid Build Coastguard Worker            if($trace) {
199*6236dae4SAndroid Build Coastguard Worker                printf("REALLOC: %d less bytes and ", $sizeataddr{$oldaddr});
200*6236dae4SAndroid Build Coastguard Worker            }
201*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$oldaddr}=0;
202*6236dae4SAndroid Build Coastguard Worker
203*6236dae4SAndroid Build Coastguard Worker            $totalmem += $newsize;
204*6236dae4SAndroid Build Coastguard Worker            $memsum += $size;
205*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$newaddr}=$newsize;
206*6236dae4SAndroid Build Coastguard Worker
207*6236dae4SAndroid Build Coastguard Worker            if($trace) {
208*6236dae4SAndroid Build Coastguard Worker                printf("%d more bytes ($source:$linenum)\n", $newsize);
209*6236dae4SAndroid Build Coastguard Worker            }
210*6236dae4SAndroid Build Coastguard Worker
211*6236dae4SAndroid Build Coastguard Worker            newtotal($totalmem);
212*6236dae4SAndroid Build Coastguard Worker            $reallocs++;
213*6236dae4SAndroid Build Coastguard Worker
214*6236dae4SAndroid Build Coastguard Worker            $getmem{$oldaddr}="";
215*6236dae4SAndroid Build Coastguard Worker            $getmem{$newaddr}="$source:$linenum";
216*6236dae4SAndroid Build Coastguard Worker        }
217*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /strdup\(0x([0-9a-f]*)\) \((\d*)\) = 0x([0-9a-f]*)/) {
218*6236dae4SAndroid Build Coastguard Worker            # strdup(a5b50) (8) = df7c0
219*6236dae4SAndroid Build Coastguard Worker
220*6236dae4SAndroid Build Coastguard Worker            $dup = $1;
221*6236dae4SAndroid Build Coastguard Worker            $size = $2;
222*6236dae4SAndroid Build Coastguard Worker            $addr = $3;
223*6236dae4SAndroid Build Coastguard Worker            $getmem{$addr}="$source:$linenum";
224*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$addr}=$size;
225*6236dae4SAndroid Build Coastguard Worker
226*6236dae4SAndroid Build Coastguard Worker            $totalmem += $size;
227*6236dae4SAndroid Build Coastguard Worker            $memsum += $size;
228*6236dae4SAndroid Build Coastguard Worker
229*6236dae4SAndroid Build Coastguard Worker            if($trace) {
230*6236dae4SAndroid Build Coastguard Worker                printf("STRDUP: $size bytes at %s, makes totally: %d bytes\n",
231*6236dae4SAndroid Build Coastguard Worker                       $getmem{$addr}, $totalmem);
232*6236dae4SAndroid Build Coastguard Worker            }
233*6236dae4SAndroid Build Coastguard Worker
234*6236dae4SAndroid Build Coastguard Worker            newtotal($totalmem);
235*6236dae4SAndroid Build Coastguard Worker            $strdups++;
236*6236dae4SAndroid Build Coastguard Worker        }
237*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /wcsdup\(0x([0-9a-f]*)\) \((\d*)\) = 0x([0-9a-f]*)/) {
238*6236dae4SAndroid Build Coastguard Worker            # wcsdup(a5b50) (8) = df7c0
239*6236dae4SAndroid Build Coastguard Worker
240*6236dae4SAndroid Build Coastguard Worker            $dup = $1;
241*6236dae4SAndroid Build Coastguard Worker            $size = $2;
242*6236dae4SAndroid Build Coastguard Worker            $addr = $3;
243*6236dae4SAndroid Build Coastguard Worker            $getmem{$addr}="$source:$linenum";
244*6236dae4SAndroid Build Coastguard Worker            $sizeataddr{$addr}=$size;
245*6236dae4SAndroid Build Coastguard Worker
246*6236dae4SAndroid Build Coastguard Worker            $totalmem += $size;
247*6236dae4SAndroid Build Coastguard Worker            $memsum += $size;
248*6236dae4SAndroid Build Coastguard Worker
249*6236dae4SAndroid Build Coastguard Worker            if($trace) {
250*6236dae4SAndroid Build Coastguard Worker                printf("WCSDUP: $size bytes at %s, makes totally: %d bytes\n",
251*6236dae4SAndroid Build Coastguard Worker                       $getmem{$addr}, $totalmem);
252*6236dae4SAndroid Build Coastguard Worker            }
253*6236dae4SAndroid Build Coastguard Worker
254*6236dae4SAndroid Build Coastguard Worker            newtotal($totalmem);
255*6236dae4SAndroid Build Coastguard Worker            $wcsdups++;
256*6236dae4SAndroid Build Coastguard Worker        }
257*6236dae4SAndroid Build Coastguard Worker        else {
258*6236dae4SAndroid Build Coastguard Worker            print "Not recognized input line: $function\n";
259*6236dae4SAndroid Build Coastguard Worker        }
260*6236dae4SAndroid Build Coastguard Worker    }
261*6236dae4SAndroid Build Coastguard Worker    # FD url.c:1282 socket() = 5
262*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^FD ([^ ]*):(\d*) (.*)/) {
263*6236dae4SAndroid Build Coastguard Worker        # generic match for the filename+linenumber
264*6236dae4SAndroid Build Coastguard Worker        $source = $1;
265*6236dae4SAndroid Build Coastguard Worker        $linenum = $2;
266*6236dae4SAndroid Build Coastguard Worker        $function = $3;
267*6236dae4SAndroid Build Coastguard Worker
268*6236dae4SAndroid Build Coastguard Worker        if($function =~ /socket\(\) = (\d*)/) {
269*6236dae4SAndroid Build Coastguard Worker            $filedes{$1}=1;
270*6236dae4SAndroid Build Coastguard Worker            $getfile{$1}="$source:$linenum";
271*6236dae4SAndroid Build Coastguard Worker            $openfile++;
272*6236dae4SAndroid Build Coastguard Worker            $sockets++; # number of socket() calls
273*6236dae4SAndroid Build Coastguard Worker        }
274*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /socketpair\(\) = (\d*) (\d*)/) {
275*6236dae4SAndroid Build Coastguard Worker            $filedes{$1}=1;
276*6236dae4SAndroid Build Coastguard Worker            $getfile{$1}="$source:$linenum";
277*6236dae4SAndroid Build Coastguard Worker            $openfile++;
278*6236dae4SAndroid Build Coastguard Worker            $filedes{$2}=1;
279*6236dae4SAndroid Build Coastguard Worker            $getfile{$2}="$source:$linenum";
280*6236dae4SAndroid Build Coastguard Worker            $openfile++;
281*6236dae4SAndroid Build Coastguard Worker        }
282*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /accept\(\) = (\d*)/) {
283*6236dae4SAndroid Build Coastguard Worker            $filedes{$1}=1;
284*6236dae4SAndroid Build Coastguard Worker            $getfile{$1}="$source:$linenum";
285*6236dae4SAndroid Build Coastguard Worker            $openfile++;
286*6236dae4SAndroid Build Coastguard Worker        }
287*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /sclose\((\d*)\)/) {
288*6236dae4SAndroid Build Coastguard Worker            if($filedes{$1} != 1) {
289*6236dae4SAndroid Build Coastguard Worker                print "Close without open: $line\n";
290*6236dae4SAndroid Build Coastguard Worker            }
291*6236dae4SAndroid Build Coastguard Worker            else {
292*6236dae4SAndroid Build Coastguard Worker                $filedes{$1}=0; # closed now
293*6236dae4SAndroid Build Coastguard Worker                $openfile--;
294*6236dae4SAndroid Build Coastguard Worker            }
295*6236dae4SAndroid Build Coastguard Worker        }
296*6236dae4SAndroid Build Coastguard Worker    }
297*6236dae4SAndroid Build Coastguard Worker    # FILE url.c:1282 fopen("blabla") = 0x5ddd
298*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^FILE ([^ ]*):(\d*) (.*)/) {
299*6236dae4SAndroid Build Coastguard Worker        # generic match for the filename+linenumber
300*6236dae4SAndroid Build Coastguard Worker        $source = $1;
301*6236dae4SAndroid Build Coastguard Worker        $linenum = $2;
302*6236dae4SAndroid Build Coastguard Worker        $function = $3;
303*6236dae4SAndroid Build Coastguard Worker
304*6236dae4SAndroid Build Coastguard Worker        if($function =~ /f[d]*open\(\"(.*)\",\"([^\"]*)\"\) = (\(nil\)|0x([0-9a-f]*))/) {
305*6236dae4SAndroid Build Coastguard Worker            if($3 eq "(nil)") {
306*6236dae4SAndroid Build Coastguard Worker                ;
307*6236dae4SAndroid Build Coastguard Worker            }
308*6236dae4SAndroid Build Coastguard Worker            else {
309*6236dae4SAndroid Build Coastguard Worker                $fopen{$4}=1;
310*6236dae4SAndroid Build Coastguard Worker                $fopenfile{$4}="$source:$linenum";
311*6236dae4SAndroid Build Coastguard Worker                $fopens++;
312*6236dae4SAndroid Build Coastguard Worker            }
313*6236dae4SAndroid Build Coastguard Worker        }
314*6236dae4SAndroid Build Coastguard Worker        # fclose(0x1026c8)
315*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /fclose\(0x([0-9a-f]*)\)/) {
316*6236dae4SAndroid Build Coastguard Worker            if(!$fopen{$1}) {
317*6236dae4SAndroid Build Coastguard Worker                print "fclose() without fopen(): $line\n";
318*6236dae4SAndroid Build Coastguard Worker            }
319*6236dae4SAndroid Build Coastguard Worker            else {
320*6236dae4SAndroid Build Coastguard Worker                $fopen{$1}=0;
321*6236dae4SAndroid Build Coastguard Worker                $fopens--;
322*6236dae4SAndroid Build Coastguard Worker            }
323*6236dae4SAndroid Build Coastguard Worker        }
324*6236dae4SAndroid Build Coastguard Worker    }
325*6236dae4SAndroid Build Coastguard Worker    # GETNAME url.c:1901 getnameinfo()
326*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^GETNAME ([^ ]*):(\d*) (.*)/) {
327*6236dae4SAndroid Build Coastguard Worker        # not much to do
328*6236dae4SAndroid Build Coastguard Worker    }
329*6236dae4SAndroid Build Coastguard Worker    # SEND url.c:1901 send(83) = 83
330*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^SEND ([^ ]*):(\d*) (.*)/) {
331*6236dae4SAndroid Build Coastguard Worker        $sends++;
332*6236dae4SAndroid Build Coastguard Worker    }
333*6236dae4SAndroid Build Coastguard Worker    # RECV url.c:1901 recv(102400) = 256
334*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^RECV ([^ ]*):(\d*) (.*)/) {
335*6236dae4SAndroid Build Coastguard Worker        $recvs++;
336*6236dae4SAndroid Build Coastguard Worker    }
337*6236dae4SAndroid Build Coastguard Worker
338*6236dae4SAndroid Build Coastguard Worker    # ADDR url.c:1282 getaddrinfo() = 0x5ddd
339*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /^ADDR ([^ ]*):(\d*) (.*)/) {
340*6236dae4SAndroid Build Coastguard Worker        # generic match for the filename+linenumber
341*6236dae4SAndroid Build Coastguard Worker        $source = $1;
342*6236dae4SAndroid Build Coastguard Worker        $linenum = $2;
343*6236dae4SAndroid Build Coastguard Worker        $function = $3;
344*6236dae4SAndroid Build Coastguard Worker
345*6236dae4SAndroid Build Coastguard Worker        if($function =~ /getaddrinfo\(\) = (\(nil\)|0x([0-9a-f]*))/) {
346*6236dae4SAndroid Build Coastguard Worker            my $add = $2;
347*6236dae4SAndroid Build Coastguard Worker            if($add eq "(nil)") {
348*6236dae4SAndroid Build Coastguard Worker                ;
349*6236dae4SAndroid Build Coastguard Worker            }
350*6236dae4SAndroid Build Coastguard Worker            else {
351*6236dae4SAndroid Build Coastguard Worker                $addrinfo{$add}=1;
352*6236dae4SAndroid Build Coastguard Worker                $addrinfofile{$add}="$source:$linenum";
353*6236dae4SAndroid Build Coastguard Worker                $addrinfos++;
354*6236dae4SAndroid Build Coastguard Worker            }
355*6236dae4SAndroid Build Coastguard Worker            if($trace) {
356*6236dae4SAndroid Build Coastguard Worker                printf("GETADDRINFO ($source:$linenum)\n");
357*6236dae4SAndroid Build Coastguard Worker            }
358*6236dae4SAndroid Build Coastguard Worker        }
359*6236dae4SAndroid Build Coastguard Worker        # fclose(0x1026c8)
360*6236dae4SAndroid Build Coastguard Worker        elsif($function =~ /freeaddrinfo\(0x([0-9a-f]*)\)/) {
361*6236dae4SAndroid Build Coastguard Worker            if(!$addrinfo{$1}) {
362*6236dae4SAndroid Build Coastguard Worker                print "freeaddrinfo() without getaddrinfo(): $line\n";
363*6236dae4SAndroid Build Coastguard Worker            }
364*6236dae4SAndroid Build Coastguard Worker            else {
365*6236dae4SAndroid Build Coastguard Worker                $addrinfo{$1}=0;
366*6236dae4SAndroid Build Coastguard Worker                $addrinfos--;
367*6236dae4SAndroid Build Coastguard Worker            }
368*6236dae4SAndroid Build Coastguard Worker            if($trace) {
369*6236dae4SAndroid Build Coastguard Worker                printf("FREEADDRINFO ($source:$linenum)\n");
370*6236dae4SAndroid Build Coastguard Worker            }
371*6236dae4SAndroid Build Coastguard Worker        }
372*6236dae4SAndroid Build Coastguard Worker
373*6236dae4SAndroid Build Coastguard Worker    }
374*6236dae4SAndroid Build Coastguard Worker    else {
375*6236dae4SAndroid Build Coastguard Worker        print "Not recognized prefix line: $line\n";
376*6236dae4SAndroid Build Coastguard Worker    }
377*6236dae4SAndroid Build Coastguard Worker}
378*6236dae4SAndroid Build Coastguard Workerclose($fileh);
379*6236dae4SAndroid Build Coastguard Worker
380*6236dae4SAndroid Build Coastguard Workerif($totalmem) {
381*6236dae4SAndroid Build Coastguard Worker    print "Leak detected: memory still allocated: $totalmem bytes\n";
382*6236dae4SAndroid Build Coastguard Worker
383*6236dae4SAndroid Build Coastguard Worker    for(keys %sizeataddr) {
384*6236dae4SAndroid Build Coastguard Worker        $addr = $_;
385*6236dae4SAndroid Build Coastguard Worker        $size = $sizeataddr{$addr};
386*6236dae4SAndroid Build Coastguard Worker        if($size > 0) {
387*6236dae4SAndroid Build Coastguard Worker            print "At $addr, there's $size bytes.\n";
388*6236dae4SAndroid Build Coastguard Worker            print " allocated by ".$getmem{$addr}."\n";
389*6236dae4SAndroid Build Coastguard Worker        }
390*6236dae4SAndroid Build Coastguard Worker    }
391*6236dae4SAndroid Build Coastguard Worker}
392*6236dae4SAndroid Build Coastguard Worker
393*6236dae4SAndroid Build Coastguard Workerif($openfile) {
394*6236dae4SAndroid Build Coastguard Worker    for(keys %filedes) {
395*6236dae4SAndroid Build Coastguard Worker        if($filedes{$_} == 1) {
396*6236dae4SAndroid Build Coastguard Worker            print "Open file descriptor created at ".$getfile{$_}."\n";
397*6236dae4SAndroid Build Coastguard Worker        }
398*6236dae4SAndroid Build Coastguard Worker    }
399*6236dae4SAndroid Build Coastguard Worker}
400*6236dae4SAndroid Build Coastguard Worker
401*6236dae4SAndroid Build Coastguard Workerif($fopens) {
402*6236dae4SAndroid Build Coastguard Worker    print "Open FILE handles left at:\n";
403*6236dae4SAndroid Build Coastguard Worker    for(keys %fopen) {
404*6236dae4SAndroid Build Coastguard Worker        if($fopen{$_} == 1) {
405*6236dae4SAndroid Build Coastguard Worker            print "fopen() called at ".$fopenfile{$_}."\n";
406*6236dae4SAndroid Build Coastguard Worker        }
407*6236dae4SAndroid Build Coastguard Worker    }
408*6236dae4SAndroid Build Coastguard Worker}
409*6236dae4SAndroid Build Coastguard Worker
410*6236dae4SAndroid Build Coastguard Workerif($addrinfos) {
411*6236dae4SAndroid Build Coastguard Worker    print "IPv6-style name resolve data left at:\n";
412*6236dae4SAndroid Build Coastguard Worker    for(keys %addrinfofile) {
413*6236dae4SAndroid Build Coastguard Worker        if($addrinfo{$_} == 1) {
414*6236dae4SAndroid Build Coastguard Worker            print "getaddrinfo() called at ".$addrinfofile{$_}."\n";
415*6236dae4SAndroid Build Coastguard Worker        }
416*6236dae4SAndroid Build Coastguard Worker    }
417*6236dae4SAndroid Build Coastguard Worker}
418*6236dae4SAndroid Build Coastguard Worker
419*6236dae4SAndroid Build Coastguard Workerif($verbose) {
420*6236dae4SAndroid Build Coastguard Worker    print "Mallocs: $mallocs\n",
421*6236dae4SAndroid Build Coastguard Worker        "Reallocs: $reallocs\n",
422*6236dae4SAndroid Build Coastguard Worker        "Callocs: $callocs\n",
423*6236dae4SAndroid Build Coastguard Worker        "Strdups:  $strdups\n",
424*6236dae4SAndroid Build Coastguard Worker        "Wcsdups:  $wcsdups\n",
425*6236dae4SAndroid Build Coastguard Worker        "Frees: $frees\n",
426*6236dae4SAndroid Build Coastguard Worker        "Sends: $sends\n",
427*6236dae4SAndroid Build Coastguard Worker        "Recvs: $recvs\n",
428*6236dae4SAndroid Build Coastguard Worker        "Sockets: $sockets\n",
429*6236dae4SAndroid Build Coastguard Worker        "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n",
430*6236dae4SAndroid Build Coastguard Worker        "Operations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups + $sends + $recvs + $sockets)."\n";
431*6236dae4SAndroid Build Coastguard Worker
432*6236dae4SAndroid Build Coastguard Worker    print "Maximum allocated: $maxmem\n";
433*6236dae4SAndroid Build Coastguard Worker    print "Total allocated: $memsum\n";
434*6236dae4SAndroid Build Coastguard Worker}
435