本文记录基础的GDB调试过程,包含指令如下:
文章目录
- 准备
- 编译文件GDB
- 启动GDB
- 开启代码行
- 设置断点
- 运行程序
- 查看pc的指令
- 查看监视的变量以及断点
- 设置快照checkpoint
- 实验1
- 实验2
- next
- nexti
- step
- x/i $pc
- finish
- info break 和 delete Num
- ref
- 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){//输出pathsfor(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];}}//bfsvector<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
当你想要快速运行完当前函数时,输入该命令即可