调试多线程程序

时间:2009-09-28 14:49:37

标签: c++ visual-studio multithreading debugging

我多年来一直是C程序员,我最喜欢的“调试器”一直是printf()函数 - 我只是在绝对强制时使用visual studio的调试器,因此从未非常精通使用它。最近我不得不修改一个从C到C ++的程序(虽然当然printf仍然工作正常)并且程序的一部分现在被分到多个线程(一个用于多核机器上的每个核心)以使程序运行快点。现在我毫无疑问会遇到像死锁一样的尴尬的多线程相关错误,我想知道我可以转向的调试方法。 visual studio(2008)是否有我可以合理需要的一切来帮助我解决线程相关的错误?我现在应该花些时间学习如何使用某些第三方调试器吗?我能用旧的printf解决大多数问题吗?

我是否可以编写代码,如果等待进入临界区,则会打印类似“线程X等待进入...但因为被线程Y使用而被阻止”的内容?

4 个答案:

答案 0 :(得分:10)

Visual Studio在某种程度上支持线程调试。通过线程窗口,您可以选择线程,挂起和恢复线程等。当您在线程之间切换时,调用堆栈窗口会相应更新,以便您可以检查每个线程正在执行的操作。您还可以将断点限制为特定的线程。

如果你想要一个替代的WinDbg(它是微软的免费Debugging Tools for Windows软件包的一部分)提供了很多选项,但是有一个更深奥的用户界面。

至于使用printf,存在同步输出的问题。如果你不这样做,你输出很可能是胡言乱语。如果您同步它,您基本上会更改应用程序的并发性,这可能会也可能不会影响您尝试解决的问题。

答案 1 :(得分:0)

如果您可以将项目移植到Linux,Valgrind(特别是'helgrind'工具)将完全按照您的要求进行操作。 http://valgrind.org/

答案 2 :(得分:0)

我不确定这是否正是您所要求的,但是,为了帮助调试,您可以编写代码,为每个线程提供一个“名称”,以便将调试消息打印到调试窗口,(或者日志文件或其他)包括该线程“名称”以及您规定的任何其他信息。下面的代码在C#中,但即使在非托管C ++中也可以使用

  Thread T = new Thread(RunSchedule);
  T.Name = "Scheduler";    // <=== Thread given a name here... 
  T.Start();

答案 3 :(得分:0)

英特尔提供了一些工具来查找与线程相关的问题:数据争用,死锁,性能损失。这些工具包括:Intel Thread Checker,Intel Thread Profiler。