gdb调试ros2程序

gdb调试ros2程序 GDB 核心调试命令速查适配 ROS2 节点lio_node调试场景以下按调试流程分类整理高频 GDB 命令兼顾基础操作与 ROS2 节点调试的实用需求命令后附简洁说明和使用示例易记易用一、启动与退出基础入口/收尾命令作用示例run/r启动调试程序传递参数时直接跟在后面run --ros-args -p config_path:/xxx/lio.yaml启动节点并传参quit/q退出 GDB终止调试程序输入q后按y确认即可start启动程序并停在主函数main第一行等效b main run直接输入start无需提前打断点二、断点设置与管理核心调试操作命令作用示例break/b函数名对指定函数打断点b main主函数断点、b lidar_processor激光雷达处理函数断点break/b行号对当前文件指定行打断点b 100当前文件第100行break/b文件名:行号对指定文件的指定行打断点跨文件调试b lio_node.cpp:50lio_node.cpp 第50行info breakpoints/info b查看所有已设置的断点含断点编号、位置、状态输入后列出所有断点用于确认/管理delete/d断点编号删除指定断点编号从info b中获取d 1删除编号为1的断点delete/d清空所有断点直接输入即可无需参数enable断点编号启用已禁用的断点enable 2启用编号2的断点disable断点编号禁用断点保留断点暂不生效disable 2禁用编号2的断点三、程序执行控制断点后单步/继续运行命令作用关键说明示例next/n单步执行跳过函数调用不进入内部适合快速走流程不深入子函数断点后输入n执行下一行step/s单步执行进入函数内部逐行调试适合调试函数内的细节逻辑遇到lidar_processor()时输入s进入函数continue/c继续运行程序直到下一个断点或程序结束断点触发后恢复运行至后续断点输入c跳过当前断点finish执行完当前所在函数返回到调用该函数的上一行适合函数内调试完成后快速返回上层在imu_processor内输入finish执行完函数并返回until/u行号运行程序直到指定行无需提前打该行列断点适合快速跳至目标行跳过中间代码u 200运行到当前文件第200行暂停四、变量与数据查看调试核心需求命令作用示例print/p变量名查看单个变量/表达式的值p cloud-size()查看点云数量、p imu_msg-angular_velocity查看IMU角速度print/p数组/容器查看数组、STL容器vector/map等内容p lidar_calib[0]查看数组第1个元素、p frame_list查看vector容器所有元素print/p变量名值临时修改变量值调试时测试不同参数效果p max_cached_frames200将缓存帧数量临时改为200watch变量名对变量设置监视点变量值被修改时自动暂停程序watch debug_mode当调试模式开关被修改时程序暂停info locals查看当前函数内的所有局部变量无需逐个输入变量名在任意函数内输入一键列出所有局部变量及值info args查看当前函数的所有参数含参数名、传入值在cloud_callback内输入查看回调函数的参数如点云消息指针五、调用栈与函数上下文排查崩溃/异常流程命令作用关键说明示例backtrace/bt查看函数调用栈从当前函数到主函数的调用链崩溃时必用快速定位异常发生的调用路径程序崩溃后输入bt查看哪层函数调用出问题backtrace/bt n查看调用栈前n行n为数字适合调用栈过长时bt 5仅查看前5层调用栈frame/f栈帧编号切换到调用栈的指定栈帧查看对应函数的变量/参数从bt中获取栈帧编号f 0当前栈帧最内层函数、f 1上一层调用函数info frame查看当前栈帧的详细信息函数地址、参数地址、局部变量地址深入调试时使用定位内存相关问题切换栈帧后输入info frame六、源码与行号查看关联代码与调试命令作用示例list/l查看当前行附近的源码默认显示前后5行共10行断点后输入l查看断点所在位置的代码list/l行号查看指定行附近的源码l 80查看第80行附近的代码list/l函数名查看指定函数的完整源码l cloud_callback查看点云回调函数的所有代码list/l文件名:行号查看指定文件的指定行源码跨文件l map_builder.cpp:30查看map_builder.cpp第30行代码七、实用进阶命令ROS2 节点调试高频命令作用适用场景set args参数提前设置run时的程序参数后续直接run即可无需重复写参数固定传参时使用set args --ros-args -p config_path:/xxx/lio.yaml后续直接runshow args查看已通过set args设置的程序参数确认参数是否设置正确signal SIGINT向调试程序发送SIGINT信号等效终端CtrlC调试ROS2节点时模拟手动中断测试节点退出逻辑ignore断点编号 次数忽略指定断点前N次触发第N1次触发时暂停适合循环内的断点ignore 3 5忽略编号3的断点前5次触发第6次暂停八、ROS2lio_node调试专属命令组合直接复用1. 快速启动主函数断点ros2 run--prefixgdb --argsfastlio2 lio_node--ros-args-p config_path:/home/xxx/agv_robot/ros2_packages/install/fastlio2/share/fastlio2/config/lio.yaml(gdb) start --ros-args -p config_path:/home/zhangying/agv_robot/ros2_packages/install/fastlio2/share/fastlio2/config/lio.yaml2. 批量设置核心断点fastlio2 关键函数(gdb) b main (gdb) b cloud_callback (gdb) b lidar_processor (gdb) b imu_processor (gdb) info b # 确认断点设置成功3. 崩溃后快速定位必用(gdb) bt # 查看调用栈定位崩溃的函数/行号 (gdb) f 0 # 切换到崩溃的栈帧 (gdb) info locals # 查看崩溃时的局部变量分析异常原因4. 临时修改参数测试无需重新编译(gdb) run --ros-args -p config_path:/xxx/lio.yaml # 启动节点 (gdb) p update_frequency20.0 # 将更新频率从10.0临时改为20.0 (gdb) c # 继续运行测试修改后的效果核心命令速记口诀易上手启动退出run启动quit退出start停主函数断点管理b打断点info b看断点d删除断点执行控制n单步跳函数s单步进函数c继续到下断查看数据p看变量bt看调用栈info locals看所有局部变量源码查看l看源码加行号/函数名精准定位。以上命令覆盖 90% 的 ROS2 节点lio_node调试场景无需死记按调试流程按需使用即可。