VS2017 C ++调试器跳过代码行

时间:2019-04-18 18:49:56

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

我进行了快速搜索,未发现与此问题类似的东西。抱歉,也许我不知道该如何搜索。

我最近从VS2015移至VS2017(社区版)。我参与了一个用C ++开发的项目。有时我需要像往常一样进行调试。

我注意到VS2017上的调试器无法像2015版上的调试器那样工作。我不知道这是否是配置问题。

问题在于单步执行,进入,跳出无法按预期方式工作(执行代码行并移至下一个/等)。我在这里上传了一些调试器行为的屏幕截图:https://imgur.com/a/FZSMFSJ

只需按F10(逐步),调试器就会以这种方式移动(第222-> 239-> 242-> 244-> 248-> 244-> 248-> 254行),甚至跳过它们之间的代码行前进和后退。

在其他图像中可以看到,断点可以正常工作,并且有两种类型的“调试行指示器”,它们具有不同的消息。

如何设置VS选项以进行所需的调试?

1 个答案:

答案 0 :(得分:2)

启用优化后,编译器可以自由地优化某些代码。例如,执行冗余分配。但是,即使禁用了所有优化,C ++标准也要求进行某些优化(例如,某些形式的RVO对象初始化)。

从您显示的代码中,我想说,编译器可能正在对(许多)局部变量的初始化进行重新排序,还可能从其源中别名化它们而不是复制它们。可以想象这样做可以减少函数内部的内存使用量,并且只要您不使用局部变量的地址或对其进行引用即可,此操作是安全的。

此外,尽管编译器保证您的代码将按顺序执行(如您编写的那样),但是大多数编译器(启用了优化)将对代码进行重新排序,以确保效率不会破坏代码。通常这样做是为了最大程度地减少内存访问,启用向量化或出于特定于硬件的指令流水线的原因。