-import sys
+import readline, sys
from IPython.core.ultratb import VerboseTB
from utils import parse_attrs
from config import dotdynadir
super(DynaInitializerException, self).__init__(msg)
-def exception_handler(etype, evalue, tb):
- # once for the log file.
- with file(dotdynadir / 'crash.log', 'wb') as crashreport:
- h = VerboseTB(color_scheme='Linux',
- call_pdb=False,
- ostream=crashreport,
- long_header=True,
- include_vars=True,
- check_cache=None)
- h(etype, evalue, tb)
+def crash_handler(interp):
+ """
+ Use our custom exception handler for handling uncaught exceptions.
+ """
- show_traceback((etype, evalue, tb))
+ def exception_handler(etype, evalue, tb):
- # TODO: we should package up all relevant state including compiler
- # version, codegen output, interpreter state (possibly without the
- # chart -- because it might be too big to email); input to repl.
- # This should all go into a tarball.
+ print 'FATAL ERROR (%s): %s' % (etype.__name__, evalue)
- if crash_handler.interp is not None:
- crash_handler.interp()
+ # once for the log file.
+ with file(dotdynadir / 'crash.log', 'wb') as crashreport:
+ h = VerboseTB(color_scheme='Linux',
+ call_pdb=False,
+ ostream=crashreport,
+ long_header=True,
+ include_vars=True,
+ check_cache=None)
+ h(etype, evalue, tb)
- print 'FATAL ERROR (%s): %s' % (etype.__name__, evalue)
- print 'Crash log available %s' % crashreport.name
+ # Dump the entirety of readline's history. I do not think that
+ # we can easily distinguish what is this session or a different
+ # one, but this is more useful than nothing.
+ #
+ # XXX Well, that'd be great, except that it doesn't work.
-def crash_handler():
- """
- Use our custom exception handler for handling uncaught exceptions.
- """
- sys.excepthook = exception_handler
+ if interp is not None:
+ if interp._repl is not None:
+ crashreport.write("REPL history:\n")
+ for ix in xrange(1,readline.get_current_history_length()):
+ crashreport.write("%d: %s\n" \
+ % (ix,readline.get_history_entry(ix)))
+
+ # TODO: we should package up all relevant state including
+ # compiler version, codegen output, interpreter state
+ # (possibly without the chart -- because it might be too big
+ # to email); input to repl. This should all go into a
+ # tarball.
-# XXX: global state...
-crash_handler.interp = None
+ show_traceback((etype, evalue, tb))
+ print 'Crash log available %s' % crashreport.name
+
+ sys.excepthook = exception_handler
def show_traceback(einfo=None):
if not einfo: