如何在Visual Studio中可靠地捕获多线程应用程序的“断点”? (C ++,VS2008)

时间:2011-10-13 19:38:56

标签: multithreading visual-studio-2008 debugging visual-studio-debugging

我有一个多线程应用程序,我正在IDE中调试(Visual Studio 2008,Win7-64,C ++)。

出于“调试”的目的,我“假装”我总是有一个处理器(程序检测本地处理器的数量),但程序设计建立了两个线程的最小(例如,处理GUI和事件流量的“主线程”,以及工作从“主线程”移出的第二个“处理”线程。 (在“生产”版本中,将有一个主线程,以及一个或多个“处理”线程,具体取决于检测到的处理器数量。)

问题:代码中的断点(在IDE中)有时会被触发,有时不会被触发。重新运行程序可能会“捕获”上一次运行它没有“捕获”的断点(没有源代码更改或重建执行以查看此更改断点捕获行为,程序执行路径为相同的)。

(我主要只关心在非GUI /非主线程中触发断点,但我认为这不重要。)

问题: 有没有办法让这些断点更“可靠”? (什么影响断点是否“抓住”?)

我知道,并不关心以下事项:

  • 来源与最新链接的可执行文件
  • 不同步
  • 构建不是“调试”(没有可用的调试符号)
  • 需要“清理构建”(调试工件已过期)
  • 当另一个帖子“中断”时,
  • “Step Over / Into”可能无法正常工作 在第一个线程的步进操作期间

在网络搜索中,提到可能将编译器设置设置为“x86”而不是“Any Processor”来捕获断点,不确定为什么这可能很重要??

最后,是的,当然,所有逻辑“应该”在单线程应用程序中进行测试(例如,重新确定单元和回归测试的确定性单线程执行因素)。但是,对于当前的测试,我需要进入“真正的”应用程序(想想“集成测试”或“系统集成”)。

2 个答案:

答案 0 :(得分:1)

通常打破非常可靠。以下是一些尝试:

  1. 使用DebugBreak()硬编码断点。这应该始终被捕获,但如果这表现出相同的破坏行为,则可以缩小问题范围。
  2. 当前有bp设置的位置,添加一行以打印到屏幕/文件,并在该行上设置断点。这是某些这条线甚至被击中了。您可能有一个奇怪的,意外的错误,实际上是意外地跳过整个部分,这是必要的。
  3. 尝试使用和不使用任何优化。调试最适合关闭所有优化,但即使使用了死信和内联功能,断点仍然可以工作。即使优化已关闭,是否会出现此问题?
  4. 你说ISO C ++,这是否意味着你实际上已经关闭了所有的微软扩展?我从来没有在visual studio中编译这种方式,但如果你有,请尝试重新切换扩展,看看是否有任何影响。

答案 1 :(得分:1)

我将同意VoidStar和其他评论。我曾经使用VC6,VS2005,VS2008和VS2010,我已经调试了相当复杂的多线程应用程序,断点对我来说一直都很可靠。

一度例外。对于使用DLL的项目,有时在DLL中的代码中设置的断点不起作用。这不是因为VS错过了断点,而是因为调试器无法将该行代码映射到编译代码中的实际位置,可能是因为pdb文件由于某种原因无法加载。当发生这种情况时,您会在断点线的左边缘看到一个空心的红色圆圈,而不是完整的红色球。这可能是你的问题吗?

我还没弄清楚为什么有时会发生这种情况,但根据我的经验,它只发生在不是正在调试的主要项目的模块中的断点。我使用的解决方法是从DLL启动调试器,将exe放在DLL项目的启动调试配置中。有时帮助的另一个技巧是将所有项目都放在一个解决方案中,并使用正确的引用设置所有项目,这样只需一次编译就可以重建整个项目。

祝你好运,我希望这会有所帮助。