C++调试方法(Vscode)(二) ——本地调试(ROS版)

初学者在调试一段代码的时候,经常出于不明原因,写出bug,导致程序崩溃。但是定位崩溃的地方时,往往采用简单而朴素的方法:即采用cout或者printf进行输出。这种方式既原始,又低效。一个合格的工程师应该是通过打断点的方式进行调试,而非加入各种print。

但是,采用gdb调试,则需要熟悉gdb的各种指令,往往不能快速入手。

好在vscode 提供了比较便捷的调试方法,本文就对vscode进行C++本地调试的方法(ROS版),做一个简单的介绍和实践。

针对这块的内容,我会更新本地调试、ROS版调试,远程docker调试等方法,见专栏地址:

C++调试专栏

本人是一个机器人工程师,所以日常写代码是基于ros的。

而ros基于的编译工具是catkin_make,和cmake语法基本一致,新增了一些catkin相关的内容。

阅读本文,必须先阅读上一篇文章:

C++调试方法(Vscode)(一) ------本地调试-CSDN博客

(一)简便启动版:

我们把main.cpp包装成一个功能包(本文功能包名为test_debug),并用catkin_make编译。(这部分内容是ros的基础,这里略过)

和上一篇类似,在CMakelists.txt中,直接加入add_definitions("-g"),然后修改launch.json文件:

我们通过F5,一样也可以进行调试步骤:

(二)通过launch启动版:

一般ros文件,都需要用launch来拉起来。

我们先创建一个start.launch文件,用来加载ros的程序:

XML 复制代码
<launch>
  <node name="test_debug_node" pkg="test_debug" type="test_debug_node" output="screen" />
</launch>

同时,我们对代码也进行修改,用一些ros的api(以证明对ros有效):

那该如何调试由launch文件拉起来的程序呢?

1. 错误尝试:

如果我们把启动的可执行文件,换成launch,行不行?

我们尝试修改json文件:

我们可以发现,如果在program中我们填入了launch文件的地址。

但是直接按F5,程序却不能运行:

2.正确方法:

首先,我们要安装ros的一些插件:

然后在配置json的时候,选择ros相关的launch:

在这里填入launch的地址:

然后我们再按F5,就可以正常调试啦:

(三)Attach方式:

这种方式的做法是,先启动程序,后挂载调试工具。

我们需要重新生成launch.json

我们可以看到,request变成了attach,然后program部分我们仍然填写程序路径。

由于这种方法需要先启动程序,所以我们要把程序中的先写一个cin,以至于程序不会马上结束

然后我们先运行这个程序:

(此时程序卡在这里,等待cin输入)

与此同时,我们查询这个进程的pid号:

我们发现进程号是9030;

于是我们仍然在vscode中运行F5:

我们在上面填入9030:

(如果填错,出现的"未找到进程"的弹窗可以按ESC关闭)

输入y:

即可弹出一些加载内容:

我们注意,为了使程序停下来等待我们启动gdb调试,因此在代码中加入了一个cin步骤(第九行);

我们此时在终端输入一个数字,使得代码跳过这一步,然后就可以观察到vscode中,已经跳到了断点位置,即可以进行调试了:

相关推荐
乐闻x10 分钟前
VSCode 插件开发实战(三):插件配置项自定义设置
ide·vscode·编辑器
我曾经是个程序员18 分钟前
鸿蒙学习记录
开发语言·前端·javascript
爱上语文19 分钟前
宠物管理系统:Dao层
java·开发语言·宠物
羊小猪~~33 分钟前
前端入门之VUE--ajax、vuex、router,最后的前端总结
前端·javascript·css·vue.js·vscode·ajax·html5
大胆飞猪1 小时前
C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)
c++
1 9 J1 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
夕泠爱吃糖1 小时前
C++中如何实现序列化和反序列化?
服务器·数据库·c++
小老鼠不吃猫1 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
长潇若雪1 小时前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
数据小小爬虫2 小时前
如何利用Python爬虫获取商品历史价格信息
开发语言·爬虫·python