GDB的C++调试方法

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

  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
在这里插入图片描述

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

test.cpp
#include <bits/stdc++.h>
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<vector<int>> walked(a, vector<int>(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<pair<int, int>> 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的时候是往右边走还是往下边走
在这里插入图片描述
可以看到,代码当中递归顺序是 上, 下, 左, 右;所以理应先往下走

实验2

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

  • 设置了断点并查看
  • 设置checkpoint
    在这里插入图片描述
    在这里插入图片描述
info checkpoints
restart 1

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值