gdb 调试

使用 GDB(GNU 调试器)来调试 C/C++ 程序时,有许多有效的方法和技巧可以帮助你快速定位问题。以下是一些有助于提高 GDB 调试效率的方法和技巧(chatGPT回答):

编译时启用调试信息

在编译程序时,使用 -g 选项来启用调试信息,这样 GDB 可以获得源代码级别的信息:

g++ -g -o my_program my_program.cpp

使用断点(Breakpoints)

断点是调试中最基本但也是最有力的工具。通过设置断点,你可以在程序执行到特定位置时暂停。

  • 设置断点:

    (gdb) break main  # 在 main 函数入口设置断点
    (gdb) break MyClass::myFunction # 在特定类的方法上设置断点
    (gdb) break my_program.cpp:25 # 在指定文件的第 25 行设置断点
  • 条件断点:可以在某个条件为真时才触发断点,有助于避免不必要的暂停。

    (gdb) break my_function if x > 5  # 当变量 x 大于 5 时触发断点

运行和继续执行程序

  • 启动程序:

    (gdb) run
  • 继续执行到下一个断点:

    (gdb) continue  # 或简写为 (gdb) c

检查变量值和内存

  • 打印变量值:

    (gdb) print my_object->member_variable  # 打印对象成员变量的值
  • 检查内存地址内容:

    (gdb) x/4xw &variable_name  # 打印 variable_name 开始的 4 个字的内存内容,以十六进制显示

逐行调试

  • 单步执行一行(会进入函数内部):

    (gdb) step  # 或简写为 (gdb) s
  • 单步执行一行(不会进入函数内部):

    (gdb) next  # 或简写为 (gdb) n
  • 执行直到函数返回:

    (gdb) finish

查看调用栈

  • 打印当前调用栈:

    (gdb) backtrace  # 或简写为 (gdb) bt
  • 打印完整的调用栈信息(包括参数值):

    (gdb) backtrace full

导航调用栈

  • 查看特定帧的信息:

    (gdb) frame 2  # 切换到第 2
  • 查看当前帧的局部变量:

    (gdb) info locals

修改变量值

  • 修改变量值(用于测试修复问题):

    (gdb) set variable_name = new_value

使用 Watchpoints

  • Watchpoints 允许你在变量值发生变化时暂停执行,非常适合调试内存写入错误或状态改变的问题。

    (gdb) rwatch variable_name  # 当 variable_name 被读取时暂停
    (gdb) awatch variable_name # 当 variable_name 被访问(读或写)时暂停

记录与回放(Reverse Debugging)

  • 在某些版本的 GDB 中,可以使用记录与回放功能来跟踪程序执行路径并回溯错误的来源。

  • 开始记录:

    (gdb) record
  • 回到前一步:

    (gdb) reverse-step

自动化脚本(GDB 脚本)

  • 如果调试任务重复性强,可以编写 GDB 脚本来自动化调试过程。在调试会话中自动执行一系列命令。

    (gdb) source script.gdb
  • 脚本示例 script.gdb

    run
    print variable_name
    continue

使用 TUI 模式

  • GDB 提供了 TUI(Text User Interface)模式,可以直观地查看源代码和寄存器值。

    (gdb) layout asm  # 显示汇编代码视图

记录调试日志

  • 使用日志记录来跟踪 GDB 调试过程中发生的事件和命令输出。

    (gdb) set logging file gdb_log.txt  # 指定日志文件

使用 GDB GUI 前端

  • 借助于图形用户界面(如 gdbguidddkdbg)可以提供更直观的调试体验。GUI 前端通常支持鼠标点击设置断点、查看变量等功能,简化了调试操作。

GDB 与 Valgrind 联合使用

  • 当怀疑程序存在内存泄漏或非法内存访问问题时,可以使用 Valgrind 来检测,再结合 GDB 定位和分析问题。

    valgrind --vgdb-error=0 ./my_program
CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议