调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置

调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置

修改CMakeLists.txt文件

  1. SET(CMAKE_BUILD_TYPE Release)修改为SET(CMAKE_BUILD_TYPE Debug)
  2. 不开启编译优化,在编译选项中包含 -g 参数来启用调试符号,使调试器能够准确地设置断点和跟踪代码。
IF(NOT CMAKE_BUILD_TYPE)
#   SET(CMAKE_BUILD_TYPE Release)
  SET(CMAKE_BUILD_TYPE Debug)
ENDIF()

MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})

# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 ")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g")
# -Wall: 这是一个编译选项,表示开启所有警告信息。-W 表示开启警告,all 表示开启所有警告。
# -O3: 这是另一个编译选项,表示开启优化级别 3。-O 表示开启优化,3 表示优化级别。

修改build.sh文件

cmake .. -DCMAKE_BUILD_TYPE=Release替换为cmake -DCMAKE_BUILD_TYPE=Debug ..

echo "Configuring and building DynaSLAM ..."

mkdir build
cd build
# cmake .. -DCMAKE_BUILD_TYPE=Release
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j4

同时,将DynaSLAM/Thirdparty/DBoW2/CMakeLists.txtDynaSLAM/Thirdparty/g2o/CMakeLists.txt中的cmake .. -DCMAKE_BUILD_TYPE=Release替换为cmake -DCMAKE_BUILD_TYPE=Debug ..

创建 c_cpp_properties.json 文件

组合快捷键Ctrl+Shift+P输入C/C++: Edit Configurations (JSON)确定,就会进入一个新的名为c_cpp_properties.json的文件编辑状态,我的内容如下:

{
    
    
    "configurations": [
        {
    
    
            "name": "Linux", // 配置的名称,可以根据需要进行更改
            "includePath": [
                "${default}", // 默认的包含路径,根据平台自动设置
                "/usr/include/python2.7", // Python 2.7 头文件路径
                "${
    
    workspaceFolder}", // 工作区根目录
                "${
    
    workspaceFolder}/include", // 自定义的头文件路径,根据实际情况进行修改
                "/usr/include/eigen3" // Eigen3 头文件路径
            ],
            "defines": [], // 定义的宏,根据需要进行设置
            "compilerPath": "/usr/bin/gcc", // C 编译器路径,根据实际情况进行修改
            "cStandard": "c17", // C 语言标准版本,根据需要进行修改
            "cppStandard": "gnu++14", // C++ 语言标准版本,根据需要进行修改
            "intelliSenseMode": "linux-gcc-x64", // IntelliSense 模式,根据平台和编译器进行设置
            "configurationProvider": "ms-vscode.cmake-tools" // 配置提供程序,用于集成 CMake 工具
        }
    ],
    "version": 4 // 配置文件版本号
}
  • ​ 这个配置文件用于为Visual Studio Code的C/C++扩展提供编译器IntelliSense功能。通过指定包含路径、编译器路径、语言标准等信息,它可以帮助编辑器提供准确的代码补全、语法检查等功能。IntelliSense是一种代码编辑器的功能,可以提供代码补全、语法检查、函数签名提示等功能,帮助开发者更高效地编写代码。
  • ​ 通过配置c_cpp_properties.json文件,您可以指定编译器的路径、包含文件的路径、宏定义、编译选项以及语言标准等信息。这些信息将被用于IntelliSense功能,使其能够正确地解析和分析您的代码,并提供相应的补全和提示。
  • ​ 例如,您可以在includePath字段中指定头文件的搜索路径,这样IntelliSense就能够正确地找到和解析这些头文件中的定义。您还可以在defines字段中添加宏定义,以便IntelliSense可以根据定义的宏来提供准确的代码补全和语法检查。
  • ​ 通过正确配置c_cpp_properties.json文件,您可以提高代码编写的效率和准确性,以及获得更好的开发体验。

创建tasks.json文件

组合快捷键Ctrl+Shift+P输入Tasks: Configure Default Build Task,创建一个新的名为tasks.json的文件编辑状态,填入如下内容.

{
    
    
	"version": "2.0.0",
	"tasks": [
	  {
    
    
		"label": "Build DynaSLAM",     // 任务的标签,用于在其他配置中引用该任务
		"type": "shell",               // 任务类型为shell,表示运行Shell命令
		"command": "sh",               // 执行的命令为sh,即运行Shell脚本
		"args": ["build.sh"],          // 传递给Shell脚本的参数
		"group": {
    
                         // 任务组配置
		  "kind": "build",             // 任务组类型为build,用于将任务标记为构建任务
		  "isDefault": true            // 该任务组为默认任务组
		},
		"presentation": {
    
                  // 任务展示配置
		  "echo": true,                // 在输出面板显示任务执行的命令和输出
		  "reveal": "always",          // 在执行任务时始终展开输出面板
		  "focus": false,              // 任务执行时不将焦点切换到输出面板
		  "panel": "shared",           // 在共享面板中展示任务输出
		  "showReuseMessage": true,    // 显示任务输出时是否显示任务已重用的消息
		  "clear": false               // 不在任务执行前清除输出面板
		}
	  }
	]
  }
  /* 这个tasks.json文件定义了一个名为"Build DynaSLAM"的任务,该任务将运行一个Shell脚本文件build.sh。
  任务被标记为构建任务,并设置为默认任务组。在任务执行期间,输出面板将显示任务执行的命令和输出,
  输出面板始终展开,但不会将焦点切换到输出面板。任务的输出将显示在共享面板中,并显示任务已重用的消息。
  在任务执行之前不会清除输出面板上的内容。
  
你可以根据自己的项目需求调整和修改这个tasks.json文件。
确保将任务的命令和参数设置为正确的构建命令和参数,以适应你的项目。 */

创建Debug用的launch.json文件

组合快捷键Ctrl+Shift+D 下拉选择添加配置...->选择C++(GDB/LLDB),就会进入一个新的名为launch.json的文件编辑状态,文件如下:
请修改为自己的路径

{
    
    
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
    
    
            "name": "(gdb) 启动",//"name"属性指定配置的名称
            "type": "cppdbg",//"type"属性指定调试类型
            "request": "launch",//"request"属性指定调试请求类型(例如启动或附加到进程)
            // "program": "${workspaceFolder}/src/Yolact_SLAM_SemanticMap/Examples/RGB-D/rgbd_tum",
            "program": "/home/cgm/DynaSLAM/Examples/RGB-D/rgbd_tum",//"program"属性指定要调试的可执行文件路径
            "args": [
                "/home/cgm/DynaSLAM/Vocabulary/ORBvoc.txt",
                "/home/cgm/DynaSLAM/Examples/RGB-D/TUM3.yaml",
                "/home/cgm/DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy",
                "/home/cgm/DynaSLAM/Examples/RGB-D/associations/fr3_walking_rpy.txt",
                "/home/cgm/DynaSLAM/results/f3_wrpy_mask222",
                "/home/cgm/DynaSLAM/results/f3_wrpy_imOut222"
  
            ],//"args"属性指定传递给程序的命令行参数
            "stopAtEntry": false,//"stopAtEntry"属性指定是否在程序入口点停止
            // "cwd": "${fileDirname}",
            "cwd": "${workspaceFolder}",//"cwd"属性指定工作目录
            // "environment": [{
    
    "name": "PATH", "value": "${env:PATH}:/home/cgm/anaconda3/envs/Yolact/bin"}], //这个不行,找不到conda环境
            "environment": [{
    
    "name": "PATH", "value": "/home/cgm/anaconda3/envs/MASKRCNN/bin:${env:PATH}"}], //"environment"属性指定要设置的环境变量
            "externalConsole": false,//"externalConsole"属性指定是否在外部控制台中运行程序
            "MIMode": "gdb",//"MIMode"属性指定要使用的调试器类型
            // 在launch.json文件中,将preLaunchTask参数值设置为我们的任务标签"Build DynaSLAM",即:
            "preLaunchTask": "Build DynaSLAM", // 设置 preLaunchTask 参数值
            /* preLaunchTask设置为"Build DynaSLAM"任务的标签意味着在启动调试之前会自动运行名为"Build DynaSLAM"的任务。
            这个任务定义在tasks.json文件中,它负责构建Dynaslam代码。
            通过将preLaunchTask与构建任务关联起来,你可以确保在开始调试之前代码已经成功编译,并且调试器可以直接开始调试过程。
            因此,通过在launch.json文件中设置preLaunchTask属性并指定对应的任务标签,
            你可以确保在启动调试会话之前先运行必要的构建任务,以便为调试过程做好准备。这样可以提高调试的效率和准确性。 */
            "setupCommands": [
                {
    
    
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
    
    
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]//"setupCommands"属性指定要在启动调试器之前发送的GDB命令。
  }
  
    ]
  }

注意preLaunchTask,这个就是ubuntu下使用vscode对c++程序进行自动化调试的关键设置

            "preLaunchTask": "Build DynaSLAM", // 设置 preLaunchTask 参数值
            /* preLaunchTask设置为"Build DynaSLAM"任务的标签意味着在启动调试之前会自动运行名为"Build DynaSLAM"的任务。
            这个任务定义在tasks.json文件中,它负责构建Dynaslam代码。
            通过将preLaunchTask与构建任务关联起来,你可以确保在开始调试之前代码已经成功编译,并且调试器可以直接开始调试过程。
            因此,通过在launch.json文件中设置preLaunchTask属性并指定对应的任务标签,
            你可以确保在启动调试会话之前先运行必要的构建任务,以便为调试过程做好准备。这样可以提高调试的效率和准确性。 */

测试运行

  • 现在就可以用组合快捷键Ctrl+Shift+B先编译项目.

Ctrl+Shift+B是Visual Studio Code中的快捷键,用于执行任务(Tasks)。通过使用Ctrl+Shift+B,您可以快速运行预定义的任务,例如构建项目、运行测试等。

上述提供的tasks.json文件定义了一个名为"Build DynaSLAM"的任务,该任务使用Shell命令运行build.sh脚本。当您按下Ctrl+Shift+B时,Visual Studio Code将执行此任务,并在输出面板中显示任务的命令和输出。

通过使用Ctrl+Shift+B执行任务,您可以快速构建Dynaslam代码,而无需手动打开终端并输入命令。这提高了您的开发效率,并使构建过程更加方便。

请注意,您可以根据需要修改tasks.json文件中的任务配置,以适应您的项目需求。确保将命令和参数设置为正确的构建命令和参数,以确保任务能够成功执行。

用组合快捷键Ctrl+Shift+B后终端显示如下信息:

 *  正在执行任务: sh build.sh 

Configuring and building Thirdparty/DBoW2 ...
mkdir: 无法创建目录 “build”: 文件已存在
-- Configuring done
-- Generating done
-- Build files have been written to: /home/cgm/DynaSLAM/Thirdparty/DBoW2/build
[100%] Built target DBoW2
Configuring and building Thirdparty/g2o ...
mkdir: 无法创建目录 “build”: 文件已存在
-- BUILD TYPE:Debug
-- Compiling on Unix
-- Configuring done
-- Generating done
-- Build files have been written to: /home/cgm/DynaSLAM/Thirdparty/g2o/build
[100%] Built target g2o
Uncompress vocabulary ...
Configuring and building DynaSLAM ...
mkdir: 无法创建目录 “build”: 文件已存在
Build type: Debug
-- Using flag -std=c++11.
PROJECT_SOURCE_DIR: /usr/local/opencv2.4.11/share/OpenCV
-- Python library status:
--     executable: 
--     version: 
--     libraries: /home/cgm/anaconda3/envs/MaskRCNN/lib/libpython2.7.so
--     library: /home/cgm/anaconda3/envs/MaskRCNN/lib/libpython2.7.so
--     include path: /usr/include/python3.8

PYTHON LIBS were found!
PYTHON LIBS DIRECTORY: /home/cgm/anaconda3/envs/MaskRCNN/lib/libpython2.7.so
Boost was found!
Boost Headers DIRECTORY: /usr/include
Boost LIBS DIRECTORY: /usr/lib/x86_64-linux-gnu
Found Libraries: Boost::thread
PROJECT_SOURCE_DIR: /home/cgm/DynaSLAM
-- Configuring done
-- Generating done
-- Build files have been written to: /home/cgm/DynaSLAM/build
[ 92%] Built target DynaSLAM
[100%] Built target rgbd_tum
 *  终端将被任务重用,按任意键关闭。 
  • F9在源文件里下断点,F5运行 GDB 调试.
    在这里插入图片描述
    直接按下F5键会根据launch.json文件中的配置启动调试会话,并根据指定的设置执行所需的操作,例如构建代码(ctrl+shift+B的操作)、设置环境变量和启动目标程序进行调试。

Vscode调试时监视Mat数据

(float*)(matDepthCurrentFrame.data),10

(float*)(mask.data),10
  • 在监视窗口中,点击加号"+“按钮或右键点击空白处,选择"Add Expression”(添加表达式)。
  • 在输入框中输入表达式(float*)(mask.data),10,然后按回车键。
  • 监视窗口将显示表达式的值,并且你可以在每次程序停止时更新该值。

表达式(float*)(mask.data),10将强制将mask.data解释为float*类型的指针,并获取该指针的前10个元素的值
在这里插入图片描述

RuntimeError: _ARRAY_API is not PyCObject object

首先我的CMakeLists.txt文件:

# CMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/cmake:$CMAKE_PREFIX_PATH
# export CMAKE_PREFIX_PATH

echo "Configuring and building Thirdparty/DBoW2 ........"

cd Thirdparty/DBoW2
mkdir build
cd build
# cmake .. -DCMAKE_BUILD_TYPE=Release
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j

cd ../../g2o

echo "Configuring and building Thirdparty/g2o .........."

mkdir build
cd build
# cmake .. -DCMAKE_BUILD_TYPE=Release
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j

cd ../../../

echo "Uncompress vocabulary ........."

cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..

echo "Configuring and building DynaSLAM ........."

mkdir build
cd build
# cmake .. -DCMAKE_BUILD_TYPE=Release
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j


cd ..
# 调试时,不要打开下面的运行命令!!!不然会出现错误RuntimeError: _ARRAY_API is not PyCObject object
# 调试时,不要打开下面的运行命令!!!不然会出现错误RuntimeError: _ARRAY_API is not PyCObject object
# 调试时,不要打开下面的运行命令!!!不然会出现错误RuntimeError: _ARRAY_API is not PyCObject object
# 调试时,不要打开下面的运行命令!!!不然会出现错误RuntimeError: _ARRAY_API is not PyCObject object

#./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_xyz/ Examples/RGB-D/associations/fr3_walking_xyz.txt /home/cgm/DynaSLAM/results/f3_wxyz_mask /home/cgm/DynaSLAM/results/f3_wxyz_imOut
#./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy/ Examples/RGB-D/associations/fr3_walking_rpy.txt
#./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_xyz/ Examples/RGB-D/associations/fr3_walking_xyz.txt /home/cgm/DynaSLAM/results/mask
# ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy/ Examples/RGB-D/associations/fr3_walking_rpy.txt /home/cgm/DynaSLAM/results/f3_wrpy_mask222 /home/cgm/DynaSLAM/results/f3_wrpy_imOut222
 ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy/ Examples/RGB-D/associations/fr3_walking_rpy.txt /home/cgm/DynaSLAM/results/f3_wrpy_mask222 /home/cgm/DynaSLAM/results/f3_wrpy_imOut222 > run_out.txt 2>&1

# conda activate MASKRCNN
# conda activate maskrcnn

这个错误是因为我有时直接./build.sh运行Dynaslam,有时又是调试,而调试的launch.json已经有参数了,而调试时`build.sh``中的命令行参数没有注释掉!

            "program": "/home/cgm/DynaSLAM/Examples/RGB-D/rgbd_tum",//"program"属性指定要调试的可执行文件路径
            "args": [
                "/home/cgm/DynaSLAM/Vocabulary/ORBvoc.txt",
                "/home/cgm/DynaSLAM/Examples/RGB-D/TUM3.yaml",
                "/home/cgm/DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy",
                "/home/cgm/DynaSLAM/Examples/RGB-D/associations/fr3_walking_rpy.txt",
                "/home/cgm/DynaSLAM/results/f3_wrpy_mask222",
                "/home/cgm/DynaSLAM/results/f3_wrpy_imOut222"
  
            ],//"args"属性指定传递给程序的命令行参数

解决:注释掉build.sh``的 ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml …/DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_rpy/ Examples/RGB-D/associations/fr3_walking_rpy.txt /home/cgm/DynaSLAM/results/f3_wrpy_mask222 /home/cgm/DynaSLAM/results/f3_wrpy_imOut222 > run_out.txt 2>&1`
然后再进行调试!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013454780/article/details/130791028