From ce0607360c8baa8917e855d97bc7f7e400c432e6 Mon Sep 17 00:00:00 2001 From: Aaron Meurer Date: Mon, 11 Mar 2013 22:59:39 -0600 Subject: [PATCH] Fix up some more of the interrupt framework This (partially) fixes #42, and also improves work on #31. Now, interrupting with Control-C works when the debugging is started with set_trace(). The SIGINT handler is enabled via the public function pudb.set_interrupt_handler. If you want to be able to enter PuDB from within your application, just call this function. By default, it uses SIGINT (i.e., Control-C), but you can change it to use a different signal if that one interferes. There is still one major issue, which is that when you break in the middle of an atomic operation, it goes to bdb. After pressing `n` several times you get to your code, though. --- pudb/__init__.py | 12 ++++++++++++ pudb/debugger.py | 8 ++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pudb/__init__.py b/pudb/__init__.py index ebdd33b5..b1fb937e 100644 --- a/pudb/__init__.py +++ b/pudb/__init__.py @@ -116,10 +116,22 @@ def set_trace(): import sys dbg = _get_debugger() + set_interrupt_handler() dbg.set_trace(sys._getframe().f_back) +def _interrupt_handler(signum, frame): + from pudb import _get_debugger + _get_debugger().set_trace(frame) +def set_interrupt_handler(interrupt_signal=None): + """ + Set up an interrupt handler, to activate PuDB when Python receives the + signal `interrupt_signal`. By default it is SIGINT (i.e., Control-C). + """ + import signal + interrupt_signal = interrupt_signal or signal.SIGINT + signal.signal(interrupt_signal, _interrupt_handler) def post_mortem(exc_info=None): if exc_info is None: diff --git a/pudb/debugger.py b/pudb/debugger.py index ab564527..3c81211d 100644 --- a/pudb/debugger.py +++ b/pudb/debugger.py @@ -5,7 +5,6 @@ import urwid import bdb import sys -import signal from pudb.settings import load_config, save_config CONFIG = load_config() @@ -30,10 +29,6 @@ def newfunc(*fargs, **fkeywords): newfunc.keywords = keywords return newfunc -def _interrupt_handler(signum, frame): - from pudb import set_trace - set_trace() - HELP_TEXT = """\ Welcome to PuDB, the Python Urwid debugger. ------------------------------------------- @@ -317,7 +312,8 @@ def _runscript(self, filename): statement = 'execfile( "%s")' % filename # Set up an interrupt handler - signal.signal(signal.SIGINT, _interrupt_handler) + from pudb import set_interrupt_handler + set_interrupt_handler() self.run(statement, globals=globals_, locals=locals_)