#!/usr/bin/python
#
# Resolves glibc's backtrace output into file and line numbers using addr2line.
#
# Evan Jones <evanj@mit.edu>
# March, 2008

import os
import re
import sys

ADDR2LINE = "addr2line"
EXTRACT_ADDR = re.compile(r'\[(0x[0-9a-f]+)\]$')

binary = sys.argv[1]

addrs = []
functions = []
filelines = []

# Extract addresses
for line in sys.stdin:
    matchobj = EXTRACT_ADDR.search(line)
    if matchobj:
        addrs.append(matchobj.group(1))

# Feed into addr2line
command = ['addr2line', '--demangle', '--functions', '-e', binary]
command.extend(addrs)

child_in, child_out = os.popen2(command)
child_in.close()
for line in child_out:
    line = line.strip()
    if len(functions) == len(filelines):
        functions.append(line)
    else:
        filelines.append(line)
code = child_out.close()
assert code is None

for fileline in filelines:
    if fileline.startswith("??"): continue
    print fileline

