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