| #!/usr/bin/python | |
| import os | |
| import re | |
| import sys | |
| import subprocess | |
| if (len(sys.argv) < 3): | |
| print "Usage: %s [binary] [log]" % (sys.argv[0]) | |
| sys.exit(1) | |
| binary = sys.argv[1] | |
| count = 0 | |
| frames = [] | |
| addrs = [] | |
| log_file = open(sys.argv[2], 'r') | |
| # Extract addresses | |
| for line in log_file: | |
| matchobj = re.compile(r'\[(0x[0-9a-f]+)\]$').search(line) | |
| if matchobj: | |
| addrs.append(matchobj.group(1)) | |
| log_file.close() | |
| # Feed into addr2line | |
| command = ['addr2line', '--demangle', '--functions', '--basename', | |
| '-e', binary] | |
| command.extend(addrs) | |
| p = subprocess.Popen(command, shell=False, bufsize=0, | |
| stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True) | |
| (child_stdin, child_stdout) = (p.stdin, p.stdout) | |
| child_stdin.close() | |
| # Backtrace display | |
| for line in child_stdout: | |
| if line.startswith("??"): | |
| continue | |
| line = line.strip() | |
| frames.append(line) | |
| child_stdout.close() | |
| frame_count = len(frames); | |
| count = 0 | |
| print "-------- backtrace --------" | |
| while count < frame_count: | |
| print "[%d]: %s() [%s]" % (count/2, frames[count], frames[count + 1]) | |
| count = count + 2 | |
| print "---------------------------" |