From 4327705cfab3eb09073ec828570bbd8f789e1611 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Fri, 15 Feb 2019 21:52:53 +0100 Subject: [PATCH] bpo-35931: Gracefully handle SyntaxError in pdb debug command (GH-11782) Previously, `debug print(` would cause the interpreter to exit on a SyntaxError whereas `print(` would properly display the error and return to the pdb prompt. This patch fixes this by pre-compiling the code before passing it to `Pdb.run`. https://bugs.python.org/issue35931 --- Lib/pdb.py | 8 +++++++- Lib/test/test_pdb.py | 8 ++++++++ .../next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 60bdb7675c8..1443f9f85c7 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1093,10 +1093,16 @@ class Pdb(bdb.Bdb, cmd.Cmd): sys.settrace(None) globals = self.curframe.f_globals locals = self.curframe_locals + try: + code = compile(arg, "", "exec") + except SyntaxError: + exc_info = sys.exc_info()[:2] + self.error(traceback.format_exception_only(*exc_info)[-1].strip()) + return p = Pdb(self.completekey, self.stdin, self.stdout) p.prompt = "(%s) " % self.prompt.strip() self.message("ENTERING RECURSIVE DEBUGGER") - sys.call_tracing(p.run, (arg, globals, locals)) + sys.call_tracing(p.run, (code, globals, locals)) self.message("LEAVING RECURSIVE DEBUGGER") sys.settrace(self.trace_dispatch) self.lastcmd = p.lastcmd diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 4f9d28afd3b..21f6b7079bb 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1486,6 +1486,14 @@ class PdbTestCase(unittest.TestCase): stdout, _ = self._run_pdb(['-m', self.module_name + '.runme'], commands) self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout) + def test_syntaxerror_in_command(self): + commands = "print(\ndebug print(" + stdout, _ = self.run_pdb_script("", commands) + self.assertEqual(stdout.splitlines()[1:], [ + '(Pdb) *** SyntaxError: unexpected EOF while parsing', + '(Pdb) *** SyntaxError: unexpected EOF while parsing', + '(Pdb) ', + ]) def load_tests(*args): from test import test_pdb diff --git a/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst b/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst new file mode 100644 index 00000000000..a229968583d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst @@ -0,0 +1 @@ +The :mod:`pdb` ``debug`` command now gracefully handles syntax errors.