我正在寻找一种方法来调试罕见的 Delphi 7 关键部分 (TCriticalSection) 挂起/死锁。在这种情况下,如果一个线程在关键部分等待超过 10 秒,我想生成一个报告,其中包含当前锁定关键部分的线程以及未能能够的线程的堆栈跟踪等待 10 秒后锁定临界区。如果引发异常或应用程序终止,则可以。
如果可能的话,我宁愿继续使用临界区,而不是使用其他同步原语,但可以在必要时切换(例如获得超时功能)。
如果该工具/方法在 IDE 之外的运行时工作,这是一个好处,因为这很难按需重现。在极少数情况下,我可以在 IDE 中复制死锁,如果我尝试暂停以开始调试,IDE 只是坐在那里什么都不做,并且永远不会进入我可以查看线程或调用堆栈的状态。不过,我可以重置正在运行的程序。
更新:在这种情况下,我只处理一个关键部分和 2 个线程,所以这可能不是锁排序问题。我相信有一个不正确的嵌套尝试跨两个不同的线程进入锁,这会导致死锁。