调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置
修改CMakeLists.txt文件
- 将
SET(CMAKE_BUILD_TYPE Release)
修改为SET(CMAKE_BUILD_TYPE Debug)
- 不开启编译优化,在编译选项中包含
-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.txt
和DynaSLAM/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
已经有参数了,而调试时CMakeLists.txt
中的命令行参数没有注释掉!
"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"属性指定传递给程序的命令行参数
解决:注释掉CMakeLists.txt
的 ./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
然后再进行调试!