File: memdump_check.py

package info (click to toggle)
python-pyahocorasick 1.4.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 748 kB
  • sloc: ansic: 4,554; python: 2,823; sh: 312; makefile: 242
file content (83 lines) | stat: -rw-r--r-- 1,860 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import sys

def main():
    try:
        path = sys.argv[1]
    except IndexError:
        path = 'memory.dump'

    app = Application(path)
    if app.run():
        sys.exit(0)
    else:
        sys.exit(1)


class Application(object):
    def __init__(self, path):
        self.path = path
        self.memory = {}


    def run(self):
        with open(self.path, 'rt') as f:
            self.analyze(f)

        self.print_leaks()

        return len(self.memory) == 0


    def analyze(self, file):
        self.memory  = {}

        for i, line in enumerate(file):
            fields = line.split()
            action = fields[0]
            if action == 'A':
                id   = fields[1]
                addr = fields[2]
                size = int(fields[3])

                assert addr not in self.memory
                self.memory[addr] = (id, size)

            elif action == 'R':

                id      = fields[1]
                oldaddr = fields[2]
                newaddr = fields[3]
                size    = int(fields[4])

                try:
                    key = int(oldaddr, 16)
                    del self.memory[oldaddr]
                except ValueError:
                    pass

                assert newaddr not in self.memory
                self.memory[newaddr] = (id, size)

            elif action == 'F':

                addr = fields[1]
                if addr in self.memory:
                    del self.memory[addr]


    def print_leaks(self):
        n = len(self.memory)
        if n == 0:
            return

        print('There are %d leaks:' % n)
        tmp = [(int(id), addr, size) for addr, (id, size) in self.memory.items()]
        tmp.sort(key=lambda item: item[0])

        for id, addr, size in tmp:
            print('#%s: %s %d' % (id, addr, size))


if __name__ == '__main__':
    main()