[Neo-report] r2674 jm - /trunk/neo/lib/live_debug.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Mar 21 11:54:22 CET 2011
Author: jm
Date: Mon Mar 21 11:54:22 2011
New Revision: 2674
Log:
live_debug: add support for winpdb and ipdb
Modified:
trunk/neo/lib/live_debug.py
Modified: trunk/neo/lib/live_debug.py
==============================================================================
--- trunk/neo/lib/live_debug.py [iso-8859-1] (original)
+++ trunk/neo/lib/live_debug.py [iso-8859-1] Mon Mar 21 11:54:22 2011
@@ -19,8 +19,8 @@ import traceback
import signal
import ctypes
import imp
+import os
import neo
-import pdb
# WARNING: This module should only be used for live application debugging.
# It - by purpose - allows code injection in a running neo process.
@@ -61,9 +61,47 @@ def debugHandler(sig, frame):
neo.__path__)
imp.load_module('neo.debug', file, filename, (suffix, mode, type))
+_debugger = None
+
@decorate
def pdbHandler(sig, frame):
- pdb.set_trace()
+ try:
+ import rpdb2
+ except ImportError:
+ global _debugger
+ if _debugger is None:
+ try: # try ipython if available
+ import IPython
+ IPython.Shell.IPShell(argv=[])
+ _debugger = IPython.Debugger.Tracer().debugger
+ except ImportError:
+ import pdb
+ _debugger = pdb.Pdb()
+ return debugger.set_trace(frame)
+ # WKRD: rpdb2 take an integer (depth) instead of a frame as parameter,
+ # so we must hardcode the value, taking the decorator into account
+ if rpdb2.g_debugger is not None:
+ return rpdb2.setbreak(2)
+ script = rpdb2.calc_frame_path(frame)
+ pwd = os.getcwd().replace('/', '_').replace('-', '_')
+ pid = os.fork()
+ if pid:
+ try:
+ rpdb2.start_embedded_debugger(pwd, depth=2)
+ finally:
+ os.waitpid(pid, 0)
+ else:
+ try:
+ os.execlp('python', 'python', '-c', """import os\nif not os.fork():
+ import rpdb2, winpdb
+ rpdb2_raw_input = rpdb2._raw_input
+ rpdb2._raw_input = lambda s: \
+ s == rpdb2.STR_PASSWORD_INPUT and %r or rpdb2_raw_input(s)
+ winpdb.g_ignored_warnings[winpdb.STR_EMBEDDED_WARNING] = True
+ winpdb.main()
+ """ % pwd, '-a', script)
+ finally:
+ os.abort()
def register(on_log=None):
if ENABLED:
More information about the Neo-report
mailing list