| #!/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 "---------------------------" |