ConnMan backtrace support
[platform/upstream/connman.git] / test / backtrace
1 #!/usr/bin/python
2
3 import os
4 import re
5 import sys
6 import subprocess
7
8 if (len(sys.argv) < 3):
9         print "Usage: %s [connman binary] [connman log]" % (sys.argv[0])
10         sys.exit(1)
11
12 binary = sys.argv[1]
13 count = 0
14 frames = []
15 addrs = []
16
17 log_file = open(sys.argv[2], 'r')
18
19 # Extract addresses
20 for line in log_file:
21     matchobj = re.compile(r'\[(0x[0-9a-f]+)\]$').search(line)
22     if matchobj:
23         addrs.append(matchobj.group(1))
24
25 log_file.close()
26
27 # Feed into addr2line
28 command = ['addr2line', '--demangle', '--functions', '--basename', '-e', binary]
29 command.extend(addrs)
30
31 p = subprocess.Popen(command, shell=False, bufsize=0,
32           stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
33 (child_stdin, child_stdout) = (p.stdin, p.stdout)
34
35 child_stdin.close()
36
37 # Backtrace display
38 for line in child_stdout:
39
40     if line.startswith("??"): continue
41
42     line = line.strip()
43
44     frames.append(line)
45
46 child_stdout.close()
47
48 frame_count = len(frames);
49
50 count = 0
51 print "-------- ConnMan backtrace --------"
52 while count < frame_count:
53     print "[%d]: %s() [%s]" % (count/2, frames[count], frames[count + 1])
54     count = count + 2
55 print "-----------------------------------"