bpo-36250: ignore ValueError from signal in non-main thread (GH-12251)
Authored-By: blueyed <github@thequod.de>
This commit is contained in:
parent
19052a1131
commit
8d64bfafdf
|
@ -340,7 +340,11 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
def interaction(self, frame, traceback):
|
||||
# Restore the previous signal handler at the Pdb prompt.
|
||||
if Pdb._previous_sigint_handler:
|
||||
try:
|
||||
signal.signal(signal.SIGINT, Pdb._previous_sigint_handler)
|
||||
except ValueError: # ValueError: signal only works in main thread
|
||||
pass
|
||||
else:
|
||||
Pdb._previous_sigint_handler = None
|
||||
if self.setup(frame, traceback):
|
||||
# no interaction desired at this time (happens if .pdbrc contains
|
||||
|
|
|
@ -1333,6 +1333,35 @@ class PdbTestCase(unittest.TestCase):
|
|||
self.assertNotIn('Error', stdout.decode(),
|
||||
"Got an error running test script under PDB")
|
||||
|
||||
def test_issue36250(self):
|
||||
|
||||
with open(support.TESTFN, 'wb') as f:
|
||||
f.write(textwrap.dedent("""
|
||||
import threading
|
||||
import pdb
|
||||
|
||||
evt = threading.Event()
|
||||
|
||||
def start_pdb():
|
||||
evt.wait()
|
||||
pdb.Pdb(readrc=False).set_trace()
|
||||
|
||||
t = threading.Thread(target=start_pdb)
|
||||
t.start()
|
||||
pdb.Pdb(readrc=False).set_trace()
|
||||
evt.set()
|
||||
t.join()""").encode('ascii'))
|
||||
cmd = [sys.executable, '-u', support.TESTFN]
|
||||
proc = subprocess.Popen(cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stdin=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
)
|
||||
self.addCleanup(proc.stdout.close)
|
||||
stdout, stderr = proc.communicate(b'cont\ncont\n')
|
||||
self.assertNotIn('Error', stdout.decode(),
|
||||
"Got an error running test script under PDB")
|
||||
|
||||
def test_issue16180(self):
|
||||
# A syntax error in the debuggee.
|
||||
script = "def f: pass\n"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Ignore ``ValueError`` from ``signal`` with ``interaction`` in non-main
|
||||
thread.
|
Loading…
Reference in New Issue