File indexing completed on 2025-05-11 08:24:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 from __future__ import print_function
0037
0038 import argparse
0039
0040
0041 class libdl_trace(object):
0042 def __init__(self, name):
0043 self.name = name
0044 self.trace = {'alloc': []}
0045
0046 def load(self):
0047 with open(self.name, 'r') as f:
0048 lc = 0
0049 for line in f:
0050 line = line[:-1]
0051 lc += 1
0052 if line.startswith('rtl: '):
0053 if line.startswith('rtl: alloc: '):
0054 self.trace['alloc'] += [(lc, line)]
0055
0056 def check_allocs(self):
0057 allocs = {}
0058 locks = 0
0059 wr_enable = False
0060 for lc, line in self.trace['alloc']:
0061 ls = line.split(' ')
0062 if len(ls) > 3:
0063 if ls[2] == 'new:':
0064 addr = ls[4].split('=')[1]
0065 size = ls[5].split('=')[1]
0066 count = 0
0067 if addr in allocs:
0068 alc, alloced, asize, count = allocs[addr]
0069 if alloced:
0070 print(
0071 '%5d: already alloced: %5d: addr=%-9s size=%-9s count=%d'
0072 % (lc, alc, addr, asize, count))
0073 allocs[addr] = (lc, True, size, count + 1)
0074 elif ls[2] == 'del:':
0075 addr = ls[4].split('=')[1]
0076 if addr != '0':
0077 if addr not in allocs:
0078 print('%5d: delete never alloced: addr=%s' %
0079 (lc, addr))
0080 else:
0081 alc, alloced, size, count = allocs[addr]
0082 if not alloced:
0083 print(
0084 '%5d: delete not alloced: %5d: addr=%-9s size=%-9s count=%d'
0085 % (lc, alc, addr, size, count))
0086 allocs[addr] = (lc, False, size, count)
0087 alloced_remaiing = 0
0088 addresses = sorted(list(allocs.keys()))
0089 for addr in addresses:
0090 lc, alloced, size, count = allocs[addr]
0091 if alloced:
0092 print('%5d: never deleted: addr=%-9s size=%-9s count=%d' %
0093 (lc, addr, size, count))
0094 alloced_remaiing += int(size)
0095 if alloced_remaiing != 0:
0096 print("Amount alloced: %d" % (alloced_remaiing))
0097
0098
0099 def run(args):
0100 argsp = argparse.ArgumentParser(prog='rtl-alloc-check',
0101 description='Audit libdl allocations')
0102 argsp.add_argument('traces', help='libdl trace files', nargs='+')
0103
0104 opts = argsp.parse_args(args[1:])
0105
0106 for t in opts.traces:
0107 trace = libdl_trace(t)
0108 trace.load()
0109 trace.check_allocs()
0110
0111
0112 if __name__ == "__main__":
0113 import sys
0114 run(sys.argv)