【问题标题】:Thread locked in Delphi XE5 appDelphi XE5 应用程序中锁定的线程
【发布时间】:2017-03-12 06:50:46
【问题描述】:

我的应用有一些随机锁定显然是没有原因的。

正如我在 embarcadero 网站上发现的,我发现一些文档可能是一些等待结束的线程。

发生这种情况时,我从 IDE 暂停程序执行并转到线程列表。

这是我得到的:

我非常坚持这一点。我怎样才能走得更远?

【问题讨论】:

  • 您的代码中存在我们看不到的缺陷。

标签: multithreading delphi debugging


【解决方案1】:

我怎样才能走得更远?

如果您的应用程序是使用调试信息构建的,那么您可以双击任何线程,您将被带到有问题的源代码行。您还将获得一个调用堆栈,告诉您在每个线程中通向“当前行”的调用链。

当然,在您的情况下,等待链提供了从哪里开始调查问题的绝佳线索。这就是事情变得棘手的地方,只有您才能进一步调试,因为只有您拥有所有源代码。

但作为一个概述:

  • 阻塞线程的调用堆栈将导致某种形式的等待函数。例如。 WaitForSingleObjectTEvent.WaitTThread.WaitFor
    • 该线程在解除阻塞之前不会继续执行。
    • 而且您希望它可以从另一个线程解锁。
  • 您需要查找调用堆栈以找到它正在等待的高级对象。请注意,识别特定的实例可能很重要,而这正是它变得棘手的地方。
  • 一旦您弄清楚了锁定的确切内容,您就需要弄清楚为什么它没有被解锁。 (请注意,您的屏幕截图引用了所有者线程和进程,这是非常有价值的信息。)
    • 您可以双击其他线程来检查它们在自己的调用堆栈中的位置。 (请注意,调试器会暂停线程,但不会阻塞;因此您可以在调用堆栈中的任何位置找到自己。)
    • 您还可以搜索与锁定资源交互的其他代码。 (事实上​​,有时这是必要的,尤其是在以下问题 #3 的情况下。)
  • 您必须检查代码以找出任何被锁定(并阻塞其他线程)的资源尚未解锁的原因。

可能的问题包括:

  1. 拥有线程很慢,最终会解锁资源。
  2. 拥有的线程有一个错误,并进入了一个无限循环,阻止它返回解锁资源。
  3. 拥有线程有一个错误,并传递了应该解锁资源但没有解锁的代码。 (造成这种情况的一个常见原因是异常处理不当;请正确使用您的 try..finally。)
  4. 拥有线程本身被阻塞。如果它被另一个 blocked 线程阻塞,那么您遇到了一种特别阴险的阻塞,称为 deadlock

在上述所有情况下,您都需要了解您的错误以便修复它。

【讨论】:

  • 实际上我意识到我以某种方式禁用了带有调试信息的构建。这就是为什么我在单击线程时没有获得源代码的原因,我在此处发布之前实际上已经尝试过。它有帮助。现在我可以正确调试我的代码了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2014-02-08
相关资源
最近更新 更多