]> granicus.if.org Git - python/commitdiff
Try to print a backtrace of wedged child process in test.
authorRichard Oudkerk <shibturn@gmail.com>
Thu, 17 Oct 2013 09:38:37 +0000 (10:38 +0100)
committerRichard Oudkerk <shibturn@gmail.com>
Thu, 17 Oct 2013 09:38:37 +0000 (10:38 +0100)
Lib/test/_test_multiprocessing.py

index 910cfa96b837d425b5ea4975257a8bb17af00c11..ac1b2a79b734810386e13893df8a3bd65974eb2b 100644 (file)
@@ -300,6 +300,9 @@ class _TestProcess(BaseTestCase):
         p.terminate()
 
         if hasattr(signal, 'alarm'):
+            # On the Gentoo buildbot waitpid() often seems to block forever.
+            # We use alarm() to interrupt it if it blocks for too long, and
+            # then try to print a backtrace for the child process using gdb.
             def handler(*args):
                 raise RuntimeError('join took too long: %s' % p)
             old_handler = signal.signal(signal.SIGALRM, handler)
@@ -307,6 +310,16 @@ class _TestProcess(BaseTestCase):
                 signal.alarm(10)
                 self.assertEqual(join(), None)
                 signal.alarm(0)
+            except RuntimeError:
+                print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG))
+                import subprocess
+                p = subprocess.Popen(['gdb', sys.executable, str(p.pid)],
+                                     stdin=subprocess.PIPE)
+                try:
+                    p.communicate(b'bt 50', timeout=10)
+                except subprocess.TimeoutExpired:
+                    p.kill()
+                raise
             finally:
                 signal.signal(signal.SIGALRM, old_handler)
         else: