]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103)
authorDaniel Hahler <github@thequod.de>
Tue, 12 Mar 2019 03:29:04 +0000 (04:29 +0100)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 12 Mar 2019 03:29:04 +0000 (20:29 -0700)
This is relevant for `debug doesnotexist()`, which would crash with a
NameError otherwise.

Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst [new file with mode: 0644]

index 1443f9f85c7e1231a1e0b02a47313c06580c8118..bf3219af3985da990b76b584a5c476c0e426d2c7 100755 (executable)
@@ -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
index 21f6b7079bb54e3f3245dc5902b8fca669145003..7e03df02946beee21fd2799bb8712ff79ab05a69 100644 (file)
@@ -1486,12 +1486,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-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 (file)
index 0000000..68c57e2
--- /dev/null
@@ -0,0 +1 @@
+The :mod:`pdb` ``debug`` command now gracefully handles all exceptions.