10秒后的Python pdb断点

10秒后的Python pdb断点,python,deadlock,pdb,Python,Deadlock,Pdb,在某些情况下,我的python程序不会响应,因为似乎出现了死锁。因为我不知道死锁发生在哪里,所以我想在10秒后设置一个断点或转储所有线程的堆栈,以了解我的程序在等待什么 使用该模块,并通过您的程序将Logger.debug调用等置于重要位置。如果需要,可以通过单个设置Logger.setLevel禁用这些消息。您可以选择是将它们写入例如stderr还是文件 import pdb from your_test_module import TestCase testcase = TestCase(

在某些情况下,我的python程序不会响应,因为似乎出现了死锁。因为我不知道死锁发生在哪里,所以我想在10秒后设置一个断点或转储所有线程的堆栈,以了解我的程序在等待什么

使用该模块,并通过您的程序将Logger.debug调用等置于重要位置。如果需要,可以通过单个设置Logger.setLevel禁用这些消息。您可以选择是将它们写入例如stderr还是文件

import pdb
from your_test_module import TestCase

testcase = TestCase()
testcase.setUp()
pdb.runcall(testcase.specific_test)

然后在空闲时按ctrl-c键。键盘中断将导致pdb进入调试器提示。

事实证明,这是因为我的数据库被锁定了,连接没有关闭,当测试被拆除,数据库架构被擦除,以便在下一次测试中数据库是干净的时,psycopg2忽略了键盘中断异常。
我用早期版本的模块解决了我的问题,有一个问题。Fault handler允许我在一段时间后使用faulthandler.dump\u traceback\u later3重复将堆栈跟踪转储到任何文件,包括sys.stderr,repeat=True。这使我能够设置断点,使程序停止响应,并有效地解决问题

只需在程序中按Ctrl-C键。这将引发一个键盘中断,它将打印一个堆栈跟踪,显示引发异常时执行的位置。@Dunes我已经尝试过了,但这个异常似乎被捕获并忽略了。您可以生成一个线程,然后休眠10秒,但是,当您从那里开始pdb时,您将不会处于发生故障的相同环境中。不过,这可能会有所帮助,这取决于你在寻找什么。无意中捕捉到键盘中断是一件非常糟糕的事情。这意味着您正在捕获各种不应该像SystemExit和MemoryError那样的异常。在代码中搜索诸如exception:或exception BaseException:之类的语句。@Dunes我发现我的代码没有捕获任何这些异常。我认为运行测试用例的不是nose就是psycopg2,但我不确定。