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