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:50(lio_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_frames=200(将缓存帧数量临时改为200) |
watch变量名 | 对变量设置监视点(变量值被修改时自动暂停程序) | 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,后续直接run |
show args | 查看已通过set args设置的程序参数 | 确认参数是否设置正确 |
signal SIGINT | 向调试程序发送SIGINT信号(等效终端Ctrl+C) | 调试ROS2节点时,模拟手动中断,测试节点退出逻辑 |
ignore断点编号 次数 | 忽略指定断点前N次触发(第N+1次触发时暂停) | 适合循环内的断点,ignore 3 5(忽略编号3的断点前5次触发,第6次暂停) |
八、ROS2lio_node调试专属命令组合(直接复用)
1. 快速启动+主函数断点
ros2 run--prefix"gdb --args"fastlio2 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.yaml
2. 批量设置核心断点(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_frequency=20.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调试场景,无需死记,按调试流程按需使用即可。