File: memcheck.py

package info (click to toggle)
liquid-dsp 1.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,216 kB
  • sloc: ansic: 115,859; sh: 3,513; makefile: 1,350; python: 274; asm: 11
file content (48 lines) | stat: -rwxr-xr-x 1,749 bytes parent folder | download
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
#!/usr/bin/env python3
'''Find memory leaks by iterating through all autotest packages'''
import argparse, re, subprocess

def packages():
    '''get package names from xautotest command-line utility'''
    cmd = './xautotest -L'
    out = subprocess.check_output(cmd.split(),stderr=subprocess.STDOUT).decode('utf-8').split('\n')
    r = []
    for line in out:
        m = re.search('^\d+: (.*)',line)
        if m is not None:
            r.append(m.group(1))
    return r

def parsecheck(lines):
    '''parse list of valgrind output lines and aggregate results into dictionary'''
    leaks = ('definitely lost', 'indirectly lost', 'possibly lost', 'still reachable', 'suppressed')
    r = {leak:0 for leak in leaks}
    r['errors'] = 0
    for line in lines:
        for leak in leaks:
            m = re.search(leak + ': *([0-9,]*) bytes',line)
            if m is not None:
                r[leak] = int(m.group(1).replace(',',''))
        m = re.search('ERROR SUMMARY: ([0-9]) errors',line)
        if m is not None:
            r['errors'] = int(m.group(1).replace(',',''))
    return r

def memcheck(package):
    '''run valgrind from command-line and check results'''
    cmd = 'valgrind --tool=memcheck ./xautotest -p %u' % (package)
    out = subprocess.check_output(cmd.split(),stderr=subprocess.STDOUT).decode('utf-8').split('\n')
    out = filter(lambda line: line.startswith('=='), out)
    return parsecheck(out)

def checkresults(results):
    '''check results from dictionary and export string summary'''
    if sum(results.values()) == 0:
        return 'pass'
    return str(results)

#for package in range(68,76):
for idx, p in enumerate(packages()):
    r = memcheck(idx)
    print('%3u:%-26s:%s' % (idx, p, checkresults(r)))