- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种方法来调试罕见的 Delphi 7 关键部分 (TCriticalSection) 挂起/死锁。在这种情况下,如果一个线程在关键部分等待超过 10 秒,我想生成一份报告,其中包含当前锁定关键部分的线程以及无法锁定关键部分的线程的堆栈跟踪。等待10秒后锁定临界区。如果引发异常或应用程序终止,那就没问题了。
如果可能的话,我更愿意继续使用关键部分,而不是使用其他同步原语,但可以在必要时进行切换(例如获得超时功能)。
如果该工具/方法可以在 IDE 之外的运行时运行,那就是一个好处,因为这很难按需重现。在极少数情况下,我可以在 IDE 内重复死锁,如果我尝试暂停以开始调试,IDE 只是坐在那里什么都不做,并且永远不会达到我可以查看线程或调用堆栈的状态。不过,我可以重置正在运行的程序。
更新:在这种情况下,我只处理一个关键部分和 2 个线程,因此这可能不是锁顺序问题。我认为存在跨两个不同线程输入锁的不正确嵌套尝试,从而导致死锁。
最佳答案
您应该创建并使用自己的锁对象类。它可以使用关键部分或互斥体来实现,具体取决于您是否想要调试它。
创建自己的类还有一个额外的好处:您可以实现锁定层次结构并在违反该层次结构时引发异常。当每次不按照完全相同的顺序获取锁时,就会发生死锁。为每个锁分配一个锁级别可以检查锁是否按正确的顺序获取。您可以将当前的锁定级别存储在 threadvar 中,并只允许获取具有较低锁定级别的锁定,否则会引发异常。即使没有发生死锁,这也会捕获所有违规行为,因此它应该会大大加快调试速度。
至于获取线程的堆栈跟踪,Stack Overflow 上有很多关于此问题的问题。
更新
你写:
In this case, I'm only dealing with one critical section and 2 threads, so this likely isn't a lock ordering problem. I believe there is an improper nested attempt to enter the lock across two different threads, which results in deadlock.
这不可能是故事的全部。在 Windows 上,单独使用两个线程和一个临界区是不可能发生死锁的,因为临界区可以由线程递归地获取。必须涉及另一种阻塞机制,例如 SendMessage()
调用。
但是,如果您确实只处理两个线程,那么其中一个必须是主/VCL/GUI 线程。在这种情况下,您应该能够使用 MadExcept "Main thread freeze checking"特征。它将尝试向主线程发送消息,并在经过可定制的时间而消息未被处理的情况下失败。如果您的主线程在关键部分上阻塞,而另一个线程在消息处理调用上阻塞,那么 MadExcept 应该能够捕获此情况并为您提供两个线程的堆栈跟踪。
关于multithreading - Delphi:通过报告锁定 "failure"上正在运行的线程的调用堆栈来调试关键部分挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3719841/
应用程序在模拟器上运行良好,但我无法在我的设备(小米 Mi4)上启动应用程序。起初我用这样的文字播种对话: Installation failed with message Failed to est
尽管使用了唯一的模块名称(例如 THIS 不是手头的问题),但在 kadena 的测试网上部署我的智能合约失败并显示以下错误消息: : Failure: Tx Failed: Keyset failu
简而言之 - 我正在尝试从 plist 中获得高分 这是读取数据的代码: var myOutput: AnyObject? = NSUserDefaults.standardUserDefau
在 Xcode(7.2 和 7.3) 中进行 UI 测试时,我的测试有时会失败并出现相当一般性的错误: Assertion Failure: UI Testing Failure - Failure
我正在尝试向 BizTalk 发送 HL7 消息并收到错误代码 0xC0C01B4e(路由失败报告)和消息: Routing Failure Report for 我已经在最后一天工作了,现在收到这
我对 scrapy 还很陌生,我正在尝试使用一些代理来抓取一些 craigslist 页面,但我收到了一些错误,如下所示。我尝试了命令 scrapy shell "https://craigslist
我正在尝试使用来自服务器的给定链接使用 URL 类下载一些内容。 我要下载的代码是: URL url = new URL(downloadUrl); I
我正在做一个数据抓取项目,我的代码使用了 Scrapy(版本 1.0.4)和 Selenium(版本 2.47.1). from scrapy import Spider from scrapy.se
我正在设置 ADF 管道以将 blob 复制到 Azure SQL DB。我的管道中有一个迭代事件,其中我设置了一个计数器,仅当 blob 存在时才进行循环和复制。 除了一些随机的 PK 违规之外,这
我正在设置 ADF 管道以将 blob 复制到 Azure SQL DB。我的管道中有一个迭代事件,其中我设置了一个计数器,仅当 blob 存在时才进行循环和复制。 除了一些随机的 PK 违规之外,这
如果 junit 测试的结果为“失败”,这到底意味着什么?我假设测试期间发生了异常,但我找不到任何有关它的信息。失败跟踪中的行也是: Assert.assertTrue(result); 其中结果只是
我正在制作这个控制台应用程序,用户必须在其中输入内容。然而,当代码到达用户输入文件名的部分,然后使用 strcat 将其添加到文件路径中时,它会输出段错误。完整代码如下: int main(int a
如何解决这个问题?命令 ionic cordova 构建 android 失败:构建因异常而失败。 出了什么问题: 无法启动守护进程。此问题可能是由于守护程序配置不正确造成的。例如,使用了无法识别的
当我尝试在我的设备而不是 Android 虚拟设备上运行应用程序时,它给出错误并停止运行。 在控制台上显示这些消息。 打开:权限被拒绝 pkg:/data/local/tmp/com.example.
今天我下载了 Android Studio v 0.8.0 beta。我正在尝试在 SDK 17 上测试我的应用程序。 Android Studio 错误 Failure [INSTALL_FAILE
我使用 Meizu MX6 在 Android Studio 上工作。以前一切正常。但似乎在更新 Flyme 之后,我开始遇到这个问题: Failure [INSTALL_FAILED_USER_RE
这个问题在这里已经有了答案: List[Try[T]] to Try[List[T]] in Scala (4 个答案) 关闭 2 年前。 如果我有一些验证函数: def validateOne(a
我安装了 Docker 版本“Docker 版本 19.03.8,构建 afacb8b”,当我尝试使用 docker pull 命令时,如“docker pull mcr.microsoft.com/
我正在Xcode 11上构建SwiftUI应用程序,但是当我切换到应用程序中的特定选项卡时,它会立即终止。 问题是,它始终指向Application Delegate文件,我认为这并不是真正的问题。我
所以我这里有一个 Azure 机器学习管道,它由许多 PythonScriptStep 任务组成 - 确实非常基本。 由于网络问题或其他问题,其中一些脚本步骤会间歇性失败 - 确实没有什么意外。这里的
我是一名优秀的程序员,十分优秀!