(original) (raw)

Index: Lib/pdb.py =================================================================== --- Lib/pdb.py (Revision 83293) +++ Lib/pdb.py (Arbeitskopie) @@ -78,6 +78,7 @@ import traceback import inspect import types +import signal class Restart(Exception): @@ -149,6 +150,8 @@ import readline except ImportError: pass + self.allow_kbdint = False + signal.signal(signal.SIGINT, self.sigint_handler) # Read $HOME/.pdbrc and ./.pdbrc self.rcLines = [] @@ -181,6 +184,13 @@ self.commands_bnum = None # The breakpoint number for which we are # defining a list + def sigint_handler(self, signum, frame): + if self.allow_kbdint: + raise KeyboardInterrupt + self.message("\nProgram interrupted. (Use 'cont' to resume).") + self.set_step() + self.set_trace(frame) + def reset(self): bdb.Bdb.reset(self) self.forget() @@ -268,7 +278,7 @@ if not self.commands_silent[currentbp]: self.print_stack_entry(self.stack[self.curindex]) if self.commands_doprompt[currentbp]: - self.cmdloop() + self._cmdloop() self.forget() return return 1 @@ -293,6 +303,17 @@ self.interaction(frame, exc_traceback) # General interaction function + def _cmdloop(self): + while True: + try: + # keyboard interrupts allow for an easy way to cancel + # the current command, so allow them during interactive input + self.allow_kbdint = True + self.cmdloop() + self.allow_kbdint = False + break + except KeyboardInterrupt: + self.message('--KeyboardInterrupt--') def interaction(self, frame, traceback): if self.setup(frame, traceback): @@ -301,7 +322,7 @@ self.forget() return self.print_stack_entry(self.stack[self.curindex]) - self.cmdloop() + self._cmdloop() self.forget() def displayhook(self, obj):