#!/usr/bin/ruby -w mallocs = Hash.new frees = Hash.new ARGF.each_line { |l| if( l =~ /^malloc\(/ ) # New memory allocation m = l.gsub( /^malloc\((\d+)\).*= (0x[0-9a-f]+)$/, '\1 \2' ).split( " " ) m[ 1 ].strip! if( mallocs[ m[ 1 ] ] == nil ) mallocs[ m[ 1 ] ] = 1 else mallocs[ m[ 1 ] ] = mallocs[ m[ 1 ] ] + 1 end elsif( l =~ /^free\(/ ) # Free m = l.gsub( /^free\((0x[0-9a-f]+)\).*$/, '\1' ) m.strip! if( frees[ m ] == nil ) frees[ m ] = 1 else frees[ m ] = frees[ m ] + 1 end end } mallocs.keys.concat( frees.keys ).uniq.each { |addr| m = mallocs[ addr ].to_i f = frees[ addr ].to_i # More mallocs than free == memory leak if( m > f ) puts "Memory leak at address: " + addr + " (f=#{f}, m=#{m})" elsif( m < f ) puts "Double free on: " + addr + " (f=#{f}, m=#{m})" end }