First upload
[CS310.git] / stacktrace
blob89d96c29e13b50118fbd41fe9cffd09ef5d53fc6
1 #!/usr/bin/env python3
3 import fileinput
4 import re
5 import subprocess
6 import sys
8 SYMBOL = "kernel/kernel.sym"
10 def main():
11     symtable = gensymtable()
12     pattern = re.compile(r"^\[<0x([0-9a-f]+)>\]$")
13     line = ""
14     while True:
15         c = sys.stdin.read(1)
16         if not c:
17             break
18         line = line + c
19         if c != '\n':
20             sys.stdout.write(c)
21             sys.stdout.flush()
22             continue
23         m = pattern.match(line)
24         line = ""
25         if not m:
26             sys.stdout.write(c)
27             continue
28         addr = int(m.group(1), base=16)
29         sys.stdout.write(" %s\n" % (addr2name(symtable, addr)))
31 def gensymtable():
32     lst = []
33     for line in open(SYMBOL, "r"):
34       addr, sym = line.split()
35       lst.append((int(addr, base=16),  sym))
36     lst.sort()
37     return lst
39 def addr2name(symtable, key):
40     base = 0
41     func = None
42     for addr, sym in symtable:
43         if key > addr:
44             base = addr
45             func = sym
46         else:
47             break
48     if not func:
49         return "?"
50     return "%s+0x%x/0x%x" % (func, key - base, addr - base)
52 if __name__ == "__main__":
53     main()