[Python-checkins] bpo-35931: Gracefully handle SyntaxError in pdb debug command (GH-11782)
Miss Islington (bot)
webhook-mailer at python.org
Fri Feb 15 15:52:57 EST 2019
https://github.com/python/cpython/commit/4327705cfab3eb09073ec828570bbd8f789e1611
commit: 4327705cfab3eb09073ec828570bbd8f789e1611
branch: master
author: Daniel Hahler <github at thequod.de>
committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
date: 2019-02-15T12:52:53-08:00
summary:
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
files:
A Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst
M Lib/pdb.py
M Lib/test/test_pdb.py
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 60bdb7675c81..1443f9f85c7e 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -1093,10 +1093,16 @@ def do_debug(self, arg):
sys.settrace(None)
globals = self.curframe.f_globals
locals = self.curframe_locals
+ try:
+ code = compile(arg, "<string>", "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 4f9d28afd3b5..21f6b7079bb5 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -1486,6 +1486,14 @@ def test_relative_imports_on_plain_module(self):
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 000000000000..a229968583d1
--- /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.
More information about the Python-checkins
mailing list