1. 编译调试版本: 在使用 colcon build
编译工作区时,你需要确保以调试模式编译,添加 --cmake-args -DCMAKE_BUILD_TYPE=Debug
参数:
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
2. 使用 gdb
进行调试
gdb
是一个常用的调试工具,可以帮助你在命令行中调试 ROS 2 节点。
步骤:
-
编译调试版本: 在使用
colcon build
编译工作区时,你需要确保以调试模式编译,添加--cmake-args -DCMAKE_BUILD_TYPE=Debug
参数:colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
-
使用
gdb
调试节点: 在调试节点时,使用gdb
来启动节点。例如:gdb --args ros2 run <package_name> <node_name>
-
设置断点并运行: 在
gdb
中启动后,你可以设置断点:break main
然后开始运行:
run
当程序遇到断点时,你可以使用
gdb
的命令来检查变量、栈帧、内存等。
2. 在 VSCode 中调试 ROS 2
VSCode 提供了图形化的调试工具,非常适合 ROS 2 开发。
配置 VSCode:
-
安装必要的扩展:
- C/C++ (by Microsoft)
- ROS (optional, by Microsoft)
-
配置
launch.json
文件: 在工作区中创建.vscode/launch.json
文件,配置 ROS 2 节点的调试信息。下面是一个简单的launch.json
示例:{ "version": "0.2.0", "configurations": [ { "name": "ROS2 Debug", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/install/<your_package_name>/lib/<your_package_name>/<your_node_name>", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build", "miDebuggerPath": "/usr/bin/gdb", "setupCommands": [ { "text": "set follow-fork-mode child" } ], "logging": { "moduleLoad": false, "trace": true } } ] }
-
启动调试:
- 打开你的 ROS 2 源代码文件,设置断点。
- 点击左侧调试图标,选择 "ROS2 Debug" 配置,然后点击 "启动调试" 按钮。
3. 使用 ros2 launch
调试
如果你使用 ros2 launch
来启动多个节点,你也可以调试其中的一个或多个节点。
步骤:
-
添加
launch-prefix
: 在你的launch
文件中,可以通过添加launch-prefix="xterm -e gdb --args"
来启动节点时附加调试器。例如:from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='your_package', executable='your_node', name='your_node', output='screen', prefix='xterm -e gdb --args' ) ])
-
启动调试: 使用
ros2 launch
命令启动这个launch
文件,xterm
会启动并附带gdb
,你可以在其中设置断点并运行调试。
4. 使用 rclcpp::Logger
进行日志调试
在调试过程中,使用 ROS 2 提供的日志工具可以帮助你快速定位问题。
#include "rclcpp/rclcpp.hpp" RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "This is an info message"); RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "This is a warning message"); RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "This is an error message");
标签:launch,vscode,args,rclcpp,--,gdb,Ros2,调试 From: https://www.cnblogs.com/ai-ldj/p/18378398