Issue #13120: Allow to call pdb.set_trace() from thread.
Patch by Ilya Sandler.
This commit is contained in:
parent
86067c2e17
commit
539ee5da6f
|
@ -955,8 +955,15 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
Continue execution, only stop when a breakpoint is encountered.
|
||||
"""
|
||||
if not self.nosigint:
|
||||
try:
|
||||
self._previous_sigint_handler = \
|
||||
signal.signal(signal.SIGINT, self.sigint_handler)
|
||||
except ValueError:
|
||||
# ValueError happens when do_continue() is invoked from
|
||||
# a non-main thread in which case we just continue without
|
||||
# SIGINT set. Would printing a message here (once) make
|
||||
# sense?
|
||||
pass
|
||||
self.set_continue()
|
||||
return 1
|
||||
do_c = do_cont = do_continue
|
||||
|
|
|
@ -664,6 +664,33 @@ class PdbTestCase(unittest.TestCase):
|
|||
any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
|
||||
'Fail to step into the caller after a return')
|
||||
|
||||
def test_issue13210(self):
|
||||
# invoking "continue" on a non-main thread triggered an exception
|
||||
# inside signal.signal
|
||||
|
||||
with open(support.TESTFN, 'wb') as f:
|
||||
f.write(textwrap.dedent("""
|
||||
import threading
|
||||
import pdb
|
||||
|
||||
def start_pdb():
|
||||
pdb.Pdb().set_trace()
|
||||
x = 1
|
||||
y = 1
|
||||
|
||||
t = threading.Thread(target=start_pdb)
|
||||
t.start()""").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\n')
|
||||
self.assertNotIn('Error', stdout.decode(),
|
||||
"Got an error running test script under PDB")
|
||||
|
||||
def tearDown(self):
|
||||
support.unlink(support.TESTFN)
|
||||
|
||||
|
|
Loading…
Reference in New Issue