解决在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")后,调试时能够停下,但是没有在断点处停下,而是在别的地方,如下图所示:
断点错位
从这张图可以看到,断点设置在42行,但调试时却停在46行的for循环入口处,显然不是我们想要的。
更离谱的是,在某些位置,调试前断点设置在某行,调试时断点却出现在别的地方,如下图所示,调试开始前设置的断点位置:
调试前
调试时的断点位置:调试时
可以看出,调试前断点在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")

调试时能够在断点处正常停止:
在这里插入图片描述
问题成功解决。

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:解决在VScode中调试C++代码断点无效、断点错位的问题-创新互联
本文网址:http://myzitong.com/article/dgjsei.html