diff options
author | 2019-03-11 21:00:59 -0700 | |
---|---|---|
committer | 2019-03-11 21:00:59 -0700 | |
commit | 1c4580d1f563173f5d6ec990b46bd38f4ae901a1 (patch) | |
tree | 2bed141c76dd65de3e9a579f12a26132df8105d8 | |
parent | [3.7] Doc: Fix inconsistency in multiprocessing (GH-12273) (GH-12275) (diff) | |
download | cpython-1c4580d1f563173f5d6ec990b46bd38f4ae901a1.tar.gz cpython-1c4580d1f563173f5d6ec990b46bd38f4ae901a1.tar.bz2 cpython-1c4580d1f563173f5d6ec990b46bd38f4ae901a1.zip |
[3.7] bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103) (GH-12285)
This is relevant for `debug doesnotexist()`, which would crash with a
NameError otherwise.
(cherry picked from commit 3e936431e23b424b1e4665e8165c245924f0ab02)
Co-authored-by: Daniel Hahler <github@thequod.de>
https://bugs.python.org/issue35931
-rwxr-xr-x | Lib/pdb.py | 12 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 22 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst | 1 |
4 files changed, 24 insertions, 12 deletions
diff --git a/Lib/pdb.py b/Lib/pdb.py index 1443f9f85c7..bf3219af398 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1093,16 +1093,14 @@ class Pdb(bdb.Bdb, cmd.Cmd): 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, (code, globals, locals)) + try: + sys.call_tracing(p.run, (arg, globals, locals)) + except Exception: + exc_info = sys.exc_info()[:2] + self.error(traceback.format_exception_only(*exc_info)[-1].strip()) 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 5b03b47ef46..f573f5f54b0 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1482,12 +1482,26 @@ 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) + def test_errors_in_command(self): + commands = "\n".join([ + 'print(', + 'debug print(', + 'debug doesnotexist', + 'c', + ]) + stdout, _ = self.run_pdb_script('', commands + '\n') + self.assertEqual(stdout.splitlines()[1:], [ '(Pdb) *** SyntaxError: unexpected EOF while parsing', - '(Pdb) *** SyntaxError: unexpected EOF while parsing', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '*** SyntaxError: unexpected EOF while parsing', + 'LEAVING RECURSIVE DEBUGGER', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '> <string>(1)<module>()', + "((Pdb)) *** NameError: name 'doesnotexist' is not defined", + 'LEAVING RECURSIVE DEBUGGER', '(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 deleted file mode 100644 index a229968583d..00000000000 --- a/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst +++ /dev/null @@ -1 +0,0 @@ -The :mod:`pdb` ``debug`` command now gracefully handles syntax errors. diff --git a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst new file mode 100644 index 00000000000..68c57e2e69d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst @@ -0,0 +1 @@ +The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. |