#!/usr/bin/env python # Read a log file from a program using dmem, and produce a summary of unfreed # allocations. import sys marker = "==dmem-debug== " allocs = {} while 1: l = sys.stdin.readline() if l == "": break l = l[:-1] if not l.startswith(marker): continue fields = l[len(marker):].split() if fields[0] == "alloc": allocs[fields[1]] = (fields[2], int(fields[3])) elif fields[0] == "free": if not fields[1] in allocs: print "freed unallocated block", fields[1] else: del allocs[fields[1]] locations = {} totals = {} for (addr, d) in allocs.items(): c = locations.setdefault(d[0], {}) c[d[1]] = c.get(d[1], 0) + 1 totals[d[0]] = totals.get(d[0], 0) + d[1] ls = locations.keys() ls.sort(lambda a, b: cmp(totals[b], totals[a])) for loc in ls: c = locations[loc] sizes = c.keys() sizes.sort() print "From %s, %d bytes:" % (loc, totals[loc]) for size in sizes: print " %8d of size %8d = %8d" % (c[size], size, c[size] * size)