Issue #13120: Allow to call pdb.set_trace() from thread.
Patch by Ilya Sandler.
This commit is contained in:
parent
86067c2e17
commit
539ee5da6f
11
Lib/pdb.py
11
Lib/pdb.py
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue