0. 寫在最前面
本文持續更新地址:https://haoqchen.site/2019/08/15/debug-ros-with-vscode/
本文檔介紹瞭如何用VSCode的Debug功能來調試ROS的CPP節點。ROS節點的調試一直非常麻煩,在此之前嘗試過gdb、CLion、Qt插件,用起來都不太順手,直到發現了VSCode的調試功能
調試的好處有:
- bug導致的
core dumped
、segmentation fault
等會停到相應的位置,方便查找 - 想到什麼,斷點停那裏就可以看到變量狀態,不用增加輸出代碼再編譯這麼麻煩
- 條件中斷,這個也不用再增加if判斷再重新編譯
如果覺得寫得還不錯,可以找我其他文章來看看哦~~~可以的話幫我github點個讚唄。
你的Star是作者堅持下去的最大動力哦~~~
1. 推薦幾個VSCode插件
-
C/C++插件:這個是微軟官方的CPP插件,裝了後就可以愉快地編寫、編譯C++代碼了。
-
C++ Intellisense:這個插件能夠很好地輔助C++開發者進行開發,提供包括代碼跳轉,自動完成,智能提示等功能。
-
ROS (deprecated):這個插件作者已經停止更新了,現在主要用來啓動roscore~~~
2. debug原理及配置
2.1 debug原理
VSCode中是以workspace
的概念處理文件關聯的,每個workspace
文件夾下會有一個.vscode
文件夾,該文件夾下放置的是關於該workspace
的路徑配置、任務配置、運行配置等文件,我們正是通過編輯這些配置文件實現對工程的管理。
微軟提供的C/C++插件集成了gdb調試功能,並提供變量界面顯示以及斷點、監視以及調用堆棧等功能。你只需要在.vscode文件夾中配置好launch.json
,就可以按下F5
快捷鍵啓動相應調試。
由於目前並沒有集成的ROS調試器,所以只能將每一個node當成一個CPP程序來進行調試。
2.2 編譯配置
在VSCode中需要在.vscode文件夾中配置好tasks.json
文件(沒有的話可自己新建一個)後,就可以按Ctrl + Shift + B
快捷鍵(這個快捷鍵需要將task歸到build的group裏才行,普通的task要Ctrl + Shift + P
選Run Task
),並選擇相關的任務進行編譯等操作。
下面展示的配置文件主要配置了prerun
、catkin build
、catkin clean
以及ccb
四個任務。下面簡介一些用到的變量,詳情請看VSCode的tasks頁面。將鼠標停留在相關變量上也可以看到。
-
label
就是一個名字,你按下快捷鍵的時候用以區分不同task -
type
任務的類型,可設置成shell
和process
。前者將任務當成命令,啓動終端運行,後者直接運行。 -
command
實際運行的命令 -
args
運行的參數,這裏需要注意的是,如果需要進行調試,需要設置爲Debug
模式,並且要檢查相應package中的CMakeLists.txt中有沒有設置成Release
模式,CMake中txt的設置優先級是最高的。比如我們的驅動就設置Release
,所以即使你在這裏怎麼設置都沒用的。 -
group
這個是分組的,貌似可以從命令行來運行分組的任務,暫時沒用到 -
presentation
關於輸出顯示的設置,這裏設置爲總是輸出到集成的終端,可通過"panel": "new"
設置每次都啓動新的終端 -
problemMatcher
錯誤分析器,可以分析到輸出的信息中有哪些錯誤並顯示 -
dependsOn
運行依賴,運行該task前會運行這些依賴的task,如果想要他們按順序運行,需要顯式聲明dependsOrder
-
其他選型
看到還有可以重定義當前路徑等很多詳細的功能。
tasks.json
文件配置:
{
"version": "2.0.0",
"tasks": [
{
"label": "prerun",
"type": "shell",
"command": "source ./devel/setup.zsh && export ROS_MASTER_URI=http://localhost:11311/ "
},
{
"label": "catkin build",
"type": "shell",
"command": "catkin",
"args": [
"build",
"-DCMAKE_BUILD_TYPE=Debug"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always"
},
"problemMatcher": "$msCompile"
},
{
"label": "catkin clean",
"type": "shell",
"command": "catkin",
"args": [
"clean",
"-y"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always"
},
"problemMatcher": "$msCompile"
},
{
"label": "ccb",
"dependsOrder": "sequence",
"dependsOn": [
"catkin clean",
"catkin build"
],
"problemMatcher": [
"$msCompile"
]
}
]
}
2.3 debug配置
主要是配置launch.json
,這裏只介紹幾個常用參數,詳細請參考VSCode中關於Debugging的介紹
-
name
任務的名字,該名字會在VSCode的Debug中顯示,用戶可選擇需要調試的任務。
-
tpye
調試器名稱。 -
request
有launch
和attach
兩種方式,前者直接運行,後者將程序綁定到之前啓動的程序 -
program
這裏需要寫生成的二進制路徑 -
args
傳進去的參數,這裏分爲ROS參數服務器形式傳進去的參數以及以main函數參數傳進去的參數,這裏介紹的是前者。有興趣可以Google一下。 -
stopAtEntry
是否在運行前暫停 -
cwd
設置當前路徑,如果程序中用的是相對路徑,則需要設置該參數爲當前路徑。 -
environment
環境變量設置 -
externalConsole
是否啓動外部終端(默認是用集成終端) -
preLaunchTask
在啓動前啓動一個task,這個prerun在前面一節有說,主要是設置source當前ROS路徑等 -
postDebugTask
運行完了之後啓動的task,節點運行完了進行清理工作 -
MIMode
調試器名稱 -
setupCommands
是給gdb的參數
{
"version": "0.2.0",
"configurations": [
{
"name": "cloud_node",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/.private/rslidar_pointcloud/lib/rslidar_pointcloud/cloud_node",
"args": [
"_model:=RS16",
"_resolution_type:=1.0cm"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "prerun",
"MIMode": "gdb",
"avoidWindowsConsoleRedirection": true,
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
2.4 多任務調試
根據VSCode中關於Debugging的介紹,可以啓動完一個任務後再啓動另外一個即可同時debug多個。
寫完多個節點後,可以通過compounds來進行配置,但compounds不能確保順序執行,嘗試通過preLaunchTask延時2秒啓動來實現順序執行,但preLaunchTask任務啓動的終端跟節點啓動的終端不是同一個。
"compounds": [
{
"name": "rslidar",
"configurations": [
"rslidar_node",
"cloud_node",
"rviz_node"
]
}
]
另外還有一個問題是,不知道怎麼確保同一個程序下次運行還用同一個終端,現在是會新建一個終端,每次重啓就新建一個,多次之後就一堆要自己刪。
todo feature
- 集成其他好用的外部調試器:Debugger Extension
- 條件斷點在VSCode中關於Debugging的介紹中有介紹
- 在同一個終端啓動名字相同的節點。
參考
- https://blog.csdn.net/weixin_35695879/article/details/85254422
- https://answers.ros.org/question/313371/vscode-debug-cpp-ros-node/
喜歡我的文章的話Star一下唄Star
版權聲明:本文爲白夜行的狼原創文章,未經允許不得以任何形式轉載