From fa18b0afe47615dbda15407a102b84e40cadf6a5 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Sun, 15 Oct 2023 03:55:00 -0700 Subject: gh-84583: Make pdb enter post-mortem mode even for SyntaxError (#110883) --- Lib/pdb.py | 9 +++------ Lib/test/test_pdb.py | 17 ++++++++++++++++- .../2023-10-14-21-33-57.gh-issue-84583.-Cmn4_.rst | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-10-14-21-33-57.gh-issue-84583.-Cmn4_.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 930cb91..129dd65 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -2151,9 +2151,6 @@ def main(): while True: try: pdb._run(target) - if pdb._user_requested_quit: - break - print("The program finished and will be restarted") except Restart: print("Restarting", target, "with arguments:") print("\t" + " ".join(sys.argv[1:])) @@ -2161,9 +2158,6 @@ def main(): # In most cases SystemExit does not warrant a post-mortem session. print("The program exited via sys.exit(). Exit status:", end=' ') print(e) - except SyntaxError: - traceback.print_exc() - sys.exit(1) except BaseException as e: traceback.print_exc() print("Uncaught exception. Entering post mortem debugging") @@ -2171,6 +2165,9 @@ def main(): pdb.interaction(None, e) print("Post mortem debugger finished. The " + target + " will be restarted") + if pdb._user_requested_quit: + break + print("The program finished and will be restarted") # When invoked as main program, invoke the debugger on a script diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index ff677ae..a668b6c 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -2638,13 +2638,28 @@ def bœr(): commands = '' expected = "SyntaxError:" stdout, stderr = self.run_pdb_script( - script, commands, expected_returncode=1 + script, commands ) self.assertIn(expected, stdout, '\n\nExpected:\n{}\nGot:\n{}\n' 'Fail to handle a syntax error in the debuggee.' .format(expected, stdout)) + def test_issue84583(self): + # A syntax error from ast.literal_eval should not make pdb exit. + script = "import ast; ast.literal_eval('')\n" + commands = """ + continue + where + quit + """ + stdout, stderr = self.run_pdb_script(script, commands) + # The code should appear 3 times in the stdout: + # 1. when pdb starts + # 2. when the exception is raised, in trackback + # 3. in where command + self.assertEqual(stdout.count("ast.literal_eval('')"), 3) + def test_issue26053(self): # run command of pdb prompt echoes the correct args script = "print('hello')" diff --git a/Misc/NEWS.d/next/Library/2023-10-14-21-33-57.gh-issue-84583.-Cmn4_.rst b/Misc/NEWS.d/next/Library/2023-10-14-21-33-57.gh-issue-84583.-Cmn4_.rst new file mode 100644 index 0000000..aa86da4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-10-14-21-33-57.gh-issue-84583.-Cmn4_.rst @@ -0,0 +1 @@ +Make :mod:`pdb` enter post-mortem mode even for :exc:`SyntaxError` -- cgit v0.12