[Python-checkins] cpython (3.2): Issue #13120: Allow to call pdb.set_trace() from thread.

andrew.svetlov python-checkins at python.org
Tue Dec 4 20:11:08 CET 2012


http://hg.python.org/cpython/rev/708586792eec
changeset:   80721:708586792eec
branch:      3.2
parent:      80714:c9b62cd81e1f
user:        Andrew Svetlov <andrew.svetlov at gmail.com>
date:        Tue Dec 04 21:08:28 2012 +0200
summary:
  Issue #13120: Allow to call pdb.set_trace() from thread.

Patch by Ilya Sandler.

files:
  Lib/pdb.py           |  11 +++++++++--
  Lib/test/test_pdb.py |  27 +++++++++++++++++++++++++++
  Misc/NEWS            |   3 +++
  3 files changed, 39 insertions(+), 2 deletions(-)


diff --git a/Lib/pdb.py b/Lib/pdb.py
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -955,8 +955,15 @@
         Continue execution, only stop when a breakpoint is encountered.
         """
         if not self.nosigint:
-            self._previous_sigint_handler = \
-                signal.signal(signal.SIGINT, self.sigint_handler)
+            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
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -664,6 +664,33 @@
             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)
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -175,6 +175,9 @@
 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.
   Patch by Serhiy Storchaka.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list