Issue #13120: Allow to call pdb.set_trace() from thread.

Patch by Ilya Sandler.
This commit is contained in:
Andrew Svetlov 2012-12-04 21:08:28 +02:00
parent 86067c2e17
commit 539ee5da6f
3 changed files with 39 additions and 2 deletions

View File

@ -955,8 +955,15 @@ class Pdb(bdb.Bdb, cmd.Cmd):
Continue execution, only stop when a breakpoint is encountered. Continue execution, only stop when a breakpoint is encountered.
""" """
if not self.nosigint: if not self.nosigint:
self._previous_sigint_handler = \ try:
signal.signal(signal.SIGINT, self.sigint_handler) 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() self.set_continue()
return 1 return 1
do_c = do_cont = do_continue do_c = do_cont = do_continue

View File

@ -664,6 +664,33 @@ class PdbTestCase(unittest.TestCase):
any('main.py(5)foo()->None' in l for l in stdout.splitlines()), any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
'Fail to step into the caller after a return') '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): def tearDown(self):
support.unlink(support.TESTFN) support.unlink(support.TESTFN)

View File

@ -175,6 +175,9 @@ Core and Builtins
Library Library
------- -------
- Issue #13120: Allow to call pdb.set_trace() from thread.
Patch by Ilya Sandler.
- Issue #10182: The re module doesn't truncate indices to 32 bits anymore. - Issue #10182: The re module doesn't truncate indices to 32 bits anymore.
Patch by Serhiy Storchaka. Patch by Serhiy Storchaka.