Visual Studio C ++ 2013调试器不稳定的步骤行为

时间:2014-07-23 19:08:24

标签: c++ debugging visual-studio-2013

我正在使用visual studio c ++ 2013 express版调试c ++应用程序,而我的调试器在程序的某个区域中不规律地跳过代码行。这是一些背景信息。以及我正在观察的行为

  • 一切正常,直到我打电话给make_shared< MyClass>(...)
  • 然后当调试器进入MyClass的构造函数时,除了初始化列表之外它是空的,每当我点击“下一行”时,调试器就开始跳过几行
  • 调试器落在随机线上,跳过不同的成员函数
  • 重要的是,调试器有时会停留在注释行
  • 我的代码似乎运行正常,如果我等到上面提到的make_shared调用后几分钟,我可以放置断点并正常执行程序。似乎构造函数是唯一不起作用的东西。主要的烦恼是其他断点因为这种不稳定的行为而被击中,所以如果有意义的话,我不能轻易跳过它。

以下是我试图解决的问题

  • 我已经尝试清除我的bin文件夹,删除.exe和.pdb文件以及其他任何文件
  • 我尝试完全重新制作项目,制作新的解决方案,将所有.h和.cpp文件复制到新项目中,然后重新构建并运行它。一切似乎工作正常,但每当我在我的代码中放置一个断点时,我发现它被无缘无故地击中,并且这种不稳定的行为开始了。

我对任何人都可以为这种情况提出的任何一般性建议感兴趣。我已经和同一个项目工作了很长时间,我从来没有遇到过这个问题。在我做了一个全新的项目后,我感到非常惊讶,我想知道是什么原因造成的。

编辑:仅供参考,我的应用程序根本没什么特别的。我不包括任何标准的外部库。没有多个线程或自定义生成设置。当你制作一个新的,空的,香草的视觉工作室项目时,相对于默认设置,一切都非常标准。

2 个答案:

答案 0 :(得分:1)

问题还可能是混合线路结尾造成的。看看here。 切勿在源文件中混合使用不同的行结尾(Linux样式:LF'\ n',Mac OS到版本9:CR'\ r',Windows:CRLF'\ r \ n')。将代码从其他地方复制/粘贴到源文件时要小心。

转到Visual Studio中的“高级保存选项”,然后选择行结尾并保存文件。

答案 1 :(得分:0)

您的信息听起来像是2个问题之一:源列表与调试信息或优化副作用之间的同步问题。

我认为这不是同步问题,因为您删除了所有临时文件并重新启动。

编译器有可能执行了一些严重的优化,导致可执行文件与列表不匹配。

以下是一些例子。

删除空函数 编译器和链接器开发人员最喜欢的是删除没有内容或未使用的函数。这会对符号调试器造成严重破坏,因为源代码表明函数存在,但编译器/链接器将其删除。

编译器创建了公共代码
编译器可能在函数之间考虑了公共代码。包含公共指令的新函数通常放在模块的末尾。这会使调试器混淆,因为新代码没有匹配的行号,或者有多个行号引用新代码。

编译器会重写您的代码
我已经发生了这种情况。汇编语言列表显示源代码没有汇编代码,因为编译器决定重写代码。内联就是一个很好的例子。我有一个简单的5次迭代循环,编译器用5个循环内容副本替换了for循环。与源代码列表不匹配,因此调试器很困惑。

汇编列表中的真相
事实是在集会清单中。如果您发布函数的汇编语言或汇编语言和C ++语言的交织列表,我们可以为您提供有关调试器跳转原因的更好详细信息。