diff options
author | Nathan Binkert <nate@binkert.org> | 2008-10-09 04:58:23 -0700 |
---|---|---|
committer | Nathan Binkert <nate@binkert.org> | 2008-10-09 04:58:23 -0700 |
commit | 68c75c589b2e006292f623bd6428754d7d590f01 (patch) | |
tree | ad9af6c1660326fc9f435190387b4893284aa05a | |
parent | 886c5f8fe5011bf9a610d2bc3cb3bb010c592510 (diff) | |
download | gem5-68c75c589b2e006292f623bd6428754d7d590f01.tar.xz |
pdb: Try to make pdb work better.
I've done a few things here. First, I invoke the script a little bit
differently so that pdb doesn't get confused. Second, I've stored the
actual filename in the module's __file__ so that pdb can find the
source file on your machine.
-rw-r--r-- | src/SConscript | 20 | ||||
-rw-r--r-- | src/python/m5/main.py | 26 |
2 files changed, 34 insertions, 12 deletions
diff --git a/src/SConscript b/src/SConscript index 1b968ec90..09ccf7722 100644 --- a/src/SConscript +++ b/src/SConscript @@ -61,8 +61,9 @@ def sort_list(_list): class PySourceFile(object): invalid_sym_char = re.compile('[^A-z0-9_]') - def __init__(self, package, source): - filename = str(source) + def __init__(self, package, tnode): + snode = tnode.srcnode() + filename = str(tnode) pyname = basename(filename) assert pyname.endswith('.py') name = pyname[:-3] @@ -70,7 +71,8 @@ class PySourceFile(object): path = package.split('.') else: path = [] - modpath = path + + modpath = path[:] if name != '__init__': modpath += [name] modpath = '.'.join(modpath) @@ -78,13 +80,17 @@ class PySourceFile(object): arcpath = path + [ pyname ] arcname = joinpath(*arcpath) - self.tnode = source - self.snode = source.srcnode() + debugname = snode.abspath + if not exists(debugname): + debugname = tnode.abspath + + self.tnode = tnode + self.snode = snode self.pyname = pyname self.package = package self.modpath = modpath self.arcname = arcname - self.filename = filename + self.debugname = debugname self.compiled = File(filename + 'c') self.assembly = File(filename + '.s') self.symname = "PyEMB_" + self.invalid_sym_char.sub('_', modpath) @@ -849,7 +855,7 @@ def objectifyPyFile(target, source, env): dst = file(str(target[0]), 'w') pysource = py_sources_tnodes[source[0]] - compiled = compile(src, pysource.snode.path, 'exec') + compiled = compile(src, pysource.debugname, 'exec') marshalled = marshal.dumps(compiled) compressed = zlib.compress(marshalled) data = compressed diff --git a/src/python/m5/main.py b/src/python/m5/main.py index 66a422efa..1f9a21899 100644 --- a/src/python/m5/main.py +++ b/src/python/m5/main.py @@ -338,7 +338,10 @@ def main(): sys.argv = arguments sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path - scope = { '__file__' : sys.argv[0], + filename = sys.argv[0] + filedata = file(filename, 'r').read() + filecode = compile(filedata, filename, 'exec') + scope = { '__file__' : filename, '__name__' : '__m5_main__' } # we want readline if we're doing anything interactive @@ -348,11 +351,24 @@ def main(): # if pdb was requested, execfile the thing under pdb, otherwise, # just do the execfile normally if options.pdb: - from pdb import Pdb - debugger = Pdb() - debugger.run('execfile("%s")' % sys.argv[0], scope) + import pdb + import traceback + + pdb = pdb.Pdb() + try: + pdb.run(filecode, scope) + except SystemExit: + print "The program exited via sys.exit(). Exit status: ", + print sys.exc_info()[1] + except: + traceback.print_exc() + print "Uncaught exception. Entering post mortem debugging" + t = sys.exc_info()[2] + while t.tb_next is not None: + t = t.tb_next + pdb.interaction(t.tb_frame,t) else: - execfile(sys.argv[0], scope) + exec filecode in scope # once the script is done if options.interactive: |