解决在VScode中调试C++代码断点无效、断点错位的问题

问题背景

最近在学习高翔博士的经典教程《视觉SLAM十四讲(第2版)》,使用其配套的Github中C++代码进行学习,在调试时发现断点无效、错位的问题,查阅了一些资料,成功解决,记录一下。
编辑器:VSCode
操作系统:Ubuntu20.04
调试方式:cmake + make
关于在VScode中调试C++代码的教程,可以参考这个:Linux下使用VS Code + CMake 调试c++程序

问题描述

在最开始的时候,CMakeLists.txt中设置成了发布模式(Release),设置断点后,调试时断点无效,即无法在任何断点处停下,而在CMakeLists.txt中设置set(CMAKE_BUILD_TYPE "Debug")后,调试时能够停下,但是没有在断点处停下,而是在别的地方,如下图所示:
解决在VScode中调试C++代码断点无效、断点错位的问题_第1张图片
从这张图可以看到,断点设置在42行,但调试时却停在46行的for循环入口处,显然不是我们想要的。
更离谱的是,在某些位置,调试前断点设置在某行,调试时断点却出现在别的地方,如下图所示,调试开始前设置的断点位置:
解决在VScode中调试C++代码断点无效、断点错位的问题_第2张图片
调试时的断点位置:解决在VScode中调试C++代码断点无效、断点错位的问题_第3张图片
可以看出,调试前断点在92行,调试开始后断点却在95行,后来查阅资料才发现,这是代码编译优化导致的。

解决方法

在VScode中使用cmake + make 方式调试C++代码时,想要正常进行断点调试,在CMakeLists.txt文件中需要注意以下两点:

  1. 设置为"Debug"模式set(CMAKE_BUILD_TYPE "Debug"),如果设置为"Release"模式,设置断点后在调试时是默认无效的,进入调试后,断点会变为空心断点,程序不会在任何断点处停下。
  2. 取消代码编译优化:一定要注释掉set(CMAKE_CXX_FLAGS "-O3")(或不写),否则“任何级别的优化都将带来代码结构的改变,将会使目标代码的执行顺序变得面目全非,导致调试信息严重不足。”

综上,在CMakeLists.txt中设置如下:

set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_CXX_FLAGS "-O3")

调试时能够在断点处正常停止:
解决在VScode中调试C++代码断点无效、断点错位的问题_第4张图片
问题成功解决。

参考文章

  1. Linux下使用VS Code + CMake 调试c++程序
  2. CMake指令解析 set(CMAKE_CXX_FLAGS “$ENV{CXXFLAGS}
  3. 添加链接描述gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

你可能感兴趣的:(vscode,c++,ide)