tl;dr; if you want a backtrace with symbols when running the eval.l version of
maru take a look at the script below
I love reading through x86 assembly as much as the next hacker but as I've
found myself playing around in eval.l and introducing segfaults it's a little
slow to figure out where I went wrong.
I first started going down the path of changing emit.l to support Dwarf debug
symbols but quickly realized how much of a pointless rathole that was.
Thankfully, we generate the assembly and comment it nicely. So I wrote a little
script to go from gdb backtraces to symbol traces.
e.g.
In your gdb session:
% gdb eval
> r test.l
> ...
> bt
#0 0x00ba1224 in ?? ()
#1 0x0002142d in __L__2865 ()
#2 0x00021860 in __L__2889 ()
#3 0x0002122b in __L__2856 ()
#4 0x000216a2 in __L__2877 ()
#5 0x00006671 in __L__357 ()
#6 0x00004bb7 in __L__223 ()
#7 0x00002145 in start ()
In another terminal
% gdb-bt maru-eval.s "#0 0x00ba1224 in ?? ()
#1 0x0002142d in __L__2865 ()
#2 0x00021860 in __L__2889 ()
#3 0x0002122b in __L__2856 ()
#4 0x000216a2 in __L__2877 ()
#5 0x00006671 in __L__357 ()
#6 0x00004bb7 in __L__223 ()
#7 0x00002145 in start ()"
-------------
#0 0x00ba1224 in ?? (): ?
#1 0x0002142d in __L__2865 (): read_list
#2 0x00021860 in __L__2889 (): k_read
#3 0x0002122b in __L__2856 (): read_quote
#4 0x000216a2 in __L__2877 (): k_read
#5 0x00006671 in __L__357 (): repl_stream
#6 0x00004bb7 in __L__223 (): main
cheers,
shawn
#!/usr/bin/env python
import re
import sys
import os
# Inferring symbols from lables
def find_label(symbol, asm):
match = re.search("^_%s:$" % symbol, asm, re.MULTILINE)
if not match:
return -1
return match.start()
def funcname_for_index(index, asm):
if index < 0:
return "?"
name_start = asm.rfind("## defunc ", 0, index)
match = re.search("^## defunc ([_a-zA-Z0-9]*)", asm[name_start:])
return match.groups(0)[0].strip()
def symbol(label, asm):
return funcname_for_index(find_label(label, asm), asm)
# Extracting labels from GCC backtraces
def extract_label(bt_entry):
return re.search("in (.*) \(\)", bt_entry).groups()[0]
def extract_labels(backtrace_entries):
return [extract_label(bt_entry) for bt_entry in backtrace_entries]
# Generating the symbolicated BT
def symbolicated_bt(backtrace, asm):
symbols = [symbol(label, asm) for label in extract_labels(backtrace)]
bt_entries_and_syms = zip(backtrace, symbols)
return ["%s:\t%s" % (bt_entry, sym) for (bt_entry, sym) in
bt_entries_and_syms]
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Usage:"
print "\t%s \"path/to/assembly.s\" \"multi-line backtrace string\"" %
os.path.basename(sys.argv[0])
sys.exit(1)
backtrace = sys.argv[2].split("\n")
asm = open(sys.argv[1], "r").read()
print "-------------\n\n"
print "\n".join(symbolicated_bt(backtrace, asm))
_______________________________________________
fonc mailing list
[email protected]
http://vpri.org/mailman/listinfo/fonc