【发布时间】:2010-10-11 19:19:21
【问题描述】:
我有一个用 C++ 和 MFC 编写的应用程序,它是在 Windows 上运行的多线程。有时我会收到一些抱怨,例如死锁或由于这些线程引起的未处理异常。通常我使用 Visual Studio(如果问题是可重现的)或者使用 WinDbg 来分析生成的转储文件。有没有更好的方法来做到这一点?我可以使用其他一些工具来执行此操作吗?
【问题讨论】:
标签: c++ multithreading debugging winapi
我有一个用 C++ 和 MFC 编写的应用程序,它是在 Windows 上运行的多线程。有时我会收到一些抱怨,例如死锁或由于这些线程引起的未处理异常。通常我使用 Visual Studio(如果问题是可重现的)或者使用 WinDbg 来分析生成的转储文件。有没有更好的方法来做到这一点?我可以使用其他一些工具来执行此操作吗?
【问题讨论】:
标签: c++ multithreading debugging winapi
如果您有足够的预算,我会推荐Intel Thread Checker。它在分析正在运行的程序和提醒您可能的竞争条件方面做得很好。
查看demonstration video 了解更多信息。
【讨论】:
我还没有开始使用它,但Relacy Race Detector 听起来对于追踪某些类别的线程问题非常有用。
【讨论】:
如果您在 CRITICAL_SECTIONs 上死锁,您可以使用 WinDbg 中的 !locks debugger extension 找出哪个线程拥有持有的锁,然后使用 kb 命令查看该线程的调用堆栈。
【讨论】:
多线程系统很复杂,阻塞的位置不是仅使用适当的工具即可完成的。要查找死锁的原因,您可以将锁定/解锁记录放在表映射中。启动“动作锁定”时,您保存在表中,解锁时会从表中删除记录。在循环结束时,您可以记录表的状态或期望特定事件执行此操作。
在 dll 中构建此实现,因此您也可以在其他项目中使用它。
【讨论】: