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

VS2017 C++ debugger skipping lines of code

本文关键字:代码 C++ 调试器 VS2017      更新时间:2023-10-16

我做了一个快速搜索,没有找到与这个问题类似的内容。也许我不知道如何搜索这个,对不起。

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

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

问题是"步过"、"步入"、"步出"没有按预期的方式工作(执行代码行并移动到下一行/等等)。我在这里上传了一些调试器行为的屏幕截图:https://i.stack.imgur.com/3V1R5.jpg

只需按 F10(单步跳过),调试器就会向该方向移动(第 222->239->242->244->248->244->248->254 行),跳过两者之间的代码行,甚至向前和向后移动。

如其他图像所示,断点工作正常,并且有 2 种类型的"调试行指示器",具有不同的消息。

如何设置 VS 选项以获取所需的调试?

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

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

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