【问题标题】:How to detect why thread exit on windows?如何检测为什么线程在Windows上退出?
【发布时间】:2017-03-05 05:06:40
【问题描述】:

我在 Windows 2008R2 上有一个使用 C++ 的进程,其中有几个线程。在进程启动期间,其中一个线程有可能退出。我没有办法检测会发生什么,有什么建议吗?

根据我的调查,线程无异常退出。访问空指针可能会导致类似的问题,但我在此过程中没有找到这样的位置。其实进程直接crash应该比较好,然后我可以得到一个dump文件;但什么也没发生,只有一个线程退出。

我曾尝试过工具用户模式进程转储程序,但它无法在该进程正在运行的 Windows 版本上运行。 我曾尝试使用工具进程监视器来检查线程退出事件,但是当我尝试通过一次又一次地启动进程来重现此问题时,进程监视器会抛出异常。

提前致谢。

【问题讨论】:

  • 反问:如果没有现成的工具,你认为你能编写自己的工具吗?
  • 你能在线程函数中添加一些代码,记录这个函数的进入和退出吗?
  • 您是否尝试通过调试器启动您的进程?您应该以这种方式获取线程退出代码。
  • stackoverflow.com/questions/7272093/… 详细介绍了多线程程序中未处理的异常。共识是整个程序终止。这意味着您的线程可能以某种方式运行到最后并正常退出。
  • 边栏:我曾经在多线程 C# Windows 服务中发现一个奇怪的情况,其中一个线程正在执行 Directory.GetFiles()。当时我们的网络有点不稳定,在通话过程中,带有该目录的服务器从网络上掉线了。那个线程停止了,再也没有恢复活力,但程序和所有其他线程都运行良好。它具有退出日志记录逻辑,但我们没有在日志中看到这一点。这是一个生产系统,因此支持人员不会让我们排除故障 - 他们重新启动了服务,但我们无法重现。

标签: c++ windows multithreading


【解决方案1】:

终于找到了根本原因——字符串被多个线程访问,一个线程就退出了。字符串不是线程安全的。

Process Monitor 帮助在强大的主机上获取线程退出调用堆栈,这使得根本原因变得清晰。

感谢大家的建议。

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多