GDB的C++调试方法

本文记录基础的GDB调试过程,包含指令如下:

文章目录

  • 准备
  • 编译文件GDB
  • 启动GDB
  • 开启代码行
  • 设置断点
  • 运行程序
  • 查看pc的指令
  • 查看监视的变量以及断点
  • 设置快照checkpoint
  • 实验1
  • 实验2

  1. next
  2. nexti
  3. step
  4. x/i $pc
  5. finish
  6. info break 和 delete Num
  7. ref
  8. break col. if condition

实例程序:

华为迷宫问题HJ45 牛客

准备

文件:输入文本 test.txt
GDB的C++调试方法_第1张图片

.cpp:
问文件主要是一个dfs函数,搜索输出最短,因为题目说只有一条可行路径,因此用dfs即可,不需要用bfs

test.cpp
#include 
using namespace std;

void dfs(vector<vector<int>>& map, vector<pair<int,int>>& paths, int x, int y){
    //记录走过,更新路径
    // cout << x << y << endl;
    map[x][y] = 1;
    pair<int, int> point(x, y);
    paths.push_back(point);

    int n = map.size()-1;
    int m = map[0].size()-1;
    if(x == n && y == m){
        //输出paths
        for(auto &x : paths){
            cout << "(" << x.first << "," << x.second << ")" <<endl;
        }
        return;
    }
    
    //上下左右搜索, 注意越界的判断要在前面
    if(x - 1 >=0 && map[x - 1][y] == 0){
        dfs(map, paths, x-1, y);
    }
    if(x + 1 <= n && map[x + 1][y] == 0){
        dfs(map, paths, x+1, y);
    }
    if(y - 1 >=0 && map[x][y-1] == 0){
        dfs(map, paths, x, y-1);
    }
    if(y + 1 <= m && map[x][y+1] == 0){
        dfs(map, paths, x, y + 1);
    }
    paths.pop_back();
    map[x][y] = 0;

}


int main() {
	freopen("test.txt", "r", stdin);
    int n, m;
    cin >> n >> m;
    // cout << a << b << endl;
    vector<vector<int>> map(n, vector<int>(m));
    // vector> walked(a, vector(b, 0));
    for(int i = 0; i < map.size(); i++){
        for(int j = 0; j < map[i].size(); j++){
            cin >> map[i][j];
        }
    }
    //bfs
    vector<pair<int, int>> paths;
    // vector> res;
    dfs(map, paths, 0, 0);
}
// 64 位输出请用 printf("%lld")

编译文件GDB

使用 -g才能获得一个可以debug的GDB调试的可执行文件, GDB为生成文件名

g++ -g migongDFS.cpp -o GDB

启动GDB

gdb GDB

开启代码行

gdb调试开始后,为了方便看运行到的位置,可以开启代码行

layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

一般可以用lay src

设置断点

b main // 某个函数头
b 5   //某行
break 5 if paths.size() ==5 //某个条件下,在某行触发

运行程序

run //开始运行
step // step into表示进入某个函数内   step out 表示跳过该函数
finish // 运行完此函数

查看pc的指令

x/i $pc

查看监视的变量以及断点

info break
delete <Num>  //删除某个变量或断点

设置快照checkpoint

checkpoints ckptName  //其实就是创建了一个新的进程
info checkpoints //查看所有的checkpoint
restart <Num>

实验1

想要查看paths等于4的时候是往右边走还是往下边走
GDB的C++调试方法_第2张图片
可以看到,代码当中递归顺序是 上, 下, 左, 右;所以理应先往下走

实验2

想要在这里设置断点,然后待多走3步之后,查看走的情况,再返回。

  • 设置了断点并查看
  • 设置checkpoint
    GDB的C++调试方法_第3张图片
    在这里插入图片描述
info checkpoints
restart 1

在这里插入图片描述
GDB的C++调试方法_第4张图片
大功告成了,如果使用vscode之类的,观察变量的变化将会更方便,这里没有使用watches来监控变量,是因为我觉得就算是用了,也是不好观察,输出不是格式化,比较繁琐。有机会可以使用vscode

最有提一嘴finish
当你想要快速运行完当前函数时,输入该命令即可

你可能感兴趣的:(c++,开发语言)