VScode debug ROS cpp程序设置 断点调试

感觉实用记得帮忙点个赞哈!!!!

说明
在vscode下面配置用于ROS项目开发的环境,通过vscode的debug可以断点调试程序,配置过程虽然有点繁琐但并不是特别复杂,需要更改地方并不是很多。

配置步骤简述:

1.在命令行执行命令:  catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes
2.在c_cpp_properties.json文件添加一行: "compileCommands": "${workspaceFolder}/build/compile_commands.json"
3.生成task.json文件 通过Ctrl+shift+P按键
4.在launch.json中更改可执行文件路径,即更改“program”项(需二进制可执行文件)
5.在launch.json中添加一行: "preLaunchTask": "catkin_make", ///////// 这个重要,需要与task中的label相同
6.在CMakeLists.txt文件中添加一行: SET(CMAKE_BUILD_TYPE Debug)

下面开始详细介绍
插件的安装
  通过vscode 左侧的EXTENSIONS 安装ros插件 c++插件
生成c_cpp_properties.json文件,添加路径
  当在cpp代码中的 #include <…> 这句话有下划线警示时,意思是提示你找不到文件路径,这时将鼠标光标放在该下划线处,点击“黄色灯泡”,点击edit c_cpp_properties.json选项,vscode会自动在配置文件夹中新建.vscode/文件夹,同时在里面初始化了c_cpp_properties.json文件,可以在该文件的includePath:选项中添加路径。c_cpp_properties.json文件在下面有详细展示。
  
一、设置编译命令
由于我们使用了#include,使用debug时找不到该文件路径,
用命令行编译我们写的c++代码,同时输出编译信息文件,这里以ROS为例

catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes

这个命令会输出一个compile_commands.json文件在ROS工作空间的build文件夹下面
然后在c_cpp_properties.json文件添加下面一段话

"compileCommands": "${workspaceFolder}/build/compile_commands.json"

修改后完整的c_cpp_properties.json文件如下所示:

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "",
                "limitSymbolsToIncludedHeaders": true
            },
            "includePath": [
                "/home/jack/test_ws/devel/include/**",
                "/opt/ros/kinetic/include/**",
                "/usr/include/**",
                "/opt/ros/kinetic/include"
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "compileCommands": "${workspaceFolder}/build/compile_commands.json"
        }
    ],
    "version": 4
}

这样,就基本可以找到全部头文件了。

二、配置task.json
按Ctrl+shift+P进入命令模式,键入tasks: Configure Task,选择 cmake:build 选项生成task.json文件。该文件是为了每次电机debug按钮是先预编译一些程序,建议复制下面的代码替换掉自动生成的task.json文件

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make", //代表提示的描述性信息
            "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
            "command": "catkin_make",//这个是我们需要运行的命令
            "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
            "group": {"kind":"build","isDefault":true},
            "presentation": {
                "reveal": "always"//可选always或者silence,代表是否输出信息
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

其中,这行设置  “group”: {“kind”:“build”,“isDefault”:true},代表将我们定义的这个task添加到build组里面,这样就可以中Ctrl+Shift+B快捷键来找到编译命令,命令名称就是在label里面定义的,如果"isDefault":true那么就代表直接执行command,如果为false还需要在build下拉里面选一下,我们这里就是label名字:catkin_make

三、配置launch.json文件
  在vscode里面已经继承了GDB调试器,点击vscode左侧的debug按钮时会自动生产一个launch.json文件,需要自己 更改该文件中的“program”项 ,更改为编译后的可执行文件的路径下的文件(需要二进制文件),对应ROS通过catkin_make生产可执行文件的路径通常在 /devel/lib/ 下,后面跟上你设置好的package名和可执行文件名,
  然后需要增加 "preLaunchTask"项,其参数需要与task.json文件中的“label”项设置的名称相同

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",   // 配置名称,将会在调试配置下拉列表中显示
            "type": "cppdbg",   // 调试器类型 该值自动生成
            "request": "launch",   // 调试方式,还可以选择attach
            "program": "${workspaceFolder}/devel/lib/smart_car/smart_car",  //要调试的程序(完整路径,支持相对路径)
            "args": [], // 传递给上面程序的参数,没有参数留空即可
            "stopAtEntry": false, // 是否停在程序入口点(停在main函数开始)
            "cwd": "${workspaceFolder}", // 调试程序时的工作目录
            "environment": [],//针对调试的程序,要添加到环境中的环境变量. 例如: [ { "name": "squid", "value": "clam" } ]
            "externalConsole": false, //如果设置为true,则为应用程序启动外部控制台。 如果为false,则不会启动控制台,并使用VS Code的内置调试控制台。
            "MIMode": "gdb",  // VSCode要使用的调试工具
            "preLaunchTask": "catkin_make", ///////// 这个重要,需要与task中的label相同
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

除此之外,因为我们不是roslaunch启动的节点,还需要一个终端运行roscore,否则会找不到ROS MASTER

四、CMakeLists.txt文件设置
 为了能执行断电调试,需要在设置CMakeLists.txt文件,添加下面程序,下面的两个set是两种写法,如果debug时不能设置断电则换另一种试一下,

#set(CMAKE_CXXX_FLAGS "${CMAKE_CXX_FLAGS} -g" )
SET(CMAKE_BUILD_TYPE Debug)

你写的程序有可能需要增加c++11标准

add_compile_options(-std=c++11)

别忘了添加自己需要编译的程序 add_executable(),这里不在赘述该项。

五、问题修正
通过以上设置后通过debug可以断电调试ROS程序,但在窗口中可能会报如下错误
:[ERROR] : poll failed with error Interrupted system call,如下所示:
在这里插入图片描述
问题现象:
   直接执行程序一切正常,但使用gdb启动程序时,即使没有任何断点,发现tcp connect 总是失败,原因是(interrupted system call)。抓包发现主机会发送FIN或者RST断开这条连接。
该问题是:
   gdb 调试网络程序发现connect 失败(interrupted system call), 程序是一个多线程程序,而且connect的线程不是主线程。
修正办法:
  设置gdb 为non-stop 模式,如此可以完美解决
  打开~/.gdbinit(如果没有这个文件则自己新建一个同名文档),然后添加一下三行即可。

set target-async 1
set pagination off
set non-stop on

参考文章:
  ros项目调试:vscode下配置开发ROS项目:
     https://blog.csdn.net/weixin_35695879/article/details/85254422
  疑难杂症】gdb调试多线程程序报错:interrupted system call:
     https://blog.csdn.net/weixin_30342209/article/details/95162905

你可能感兴趣的:(vscode)