GDB 调试常用命令

484 阅读1分钟

使用条件

编译时需用 debug 模式,否则无法在调试时看到符号及文件,为此要在 gcc 的参数里加"-g",对于 cmake,需要在编译参数中加 "-DCMAKE_BUILD_TYPE=Debug"

启动程序

(shell) $ gdb --args EXE-FILE ARGS...   // 启动程序并附带参数
$ r                     // 开始执行程序
$ r ARGS...             // 传递参数并执行
$ start                 // 启动但不执行
$ set args ARGS...      // 设置启动参数

查看

  • 代码
$ l                     // 首次显示当前帧附近代码,然后按顺序显示之后的代码(用f命令可回到当前帧)
$ l 5                   // 显示第5行周围的代码
$ l 5,10                // 显示 5-10 行代码
$ l FUNCTION            // 显示函数附近代码
$ layout src            // 打卡源代码窗口
$ ctrl+x a              // 关闭源代码窗口
$ ctrl+l                // 刷新源代码窗口
  • 变量
$ p VAR                 // 打印变量 'id' 的值
$ p/x VAR               // 以十六进制形式打印 id 的值
$ p/t VAR               // 以二进制形式打印 id 的值
$ p/f VAR               // 以浮点形式打印 id 的值
$ p var@N               // 将 var 视为数组,打印前 N 个元素
$ ptype VAR             // 打印 var 的类型
$ x/nx &VAR             // 从var地址开始以十六进制形式输出n字节
$ x/s &VAR              // 从var地址开始输出字符串
$ x/nb $VAR             // 从var地址开始以二进制形式输出n字节
$ printf FORMAT STRING  // 格式化打印
$ i locals              // 查看当前位置局部变量
$ display EXP           // 追踪表达式的值
$ watch EXP             // 监控表达式,当其值变化时停止执行

堆栈

$ f                     // 当前代码运行帧
$ bt                    // 查看当前调用栈
$ return                // 从当前帧立即返回(不执行之后的代码)
$ return VALUE          // 从当前帧立即返回,并带上指定的返回值
$ up                    // 查看上层一帧(不改变执行)
$ down                  // 查看下层一帧(不改变执行)

断点

$ i b                   // 显示所有断点
$ b                     // 在当前位置断点
$ b FUNCTION            // 在函数上断点
$ b LINE                // 在行号上断点
$ b FOO::BAR()          // 在类的方法上断点
$ b LOCTION if COND     // 条件断点
$ d INDEX               // 删除第 index 个断点
$ condition N COND      // 在第N个断点上加条件

执行

$ s                     // 步入
$ n                     // 步进
$ n N                   // 步进 N 行
$ c                     // 连续执行直到下一个断点或程序结束
$ u                     // 执行到比当前行号更高的位置(可用于跳出循环,但速度较慢)
$ u POSITION            // 执行到某个位置(行号、函数),参数和 'b' 相同
$ finish                // 执行完当前函数

文件

$ pwd                   // 显示当前目录
$ cd PATH               // 工作区跳转到 path