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

.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
当你想要快速运行完当前函数时,输入该命令即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】进程控制

进程控制&#xff1a;创建新进程&#xff0c;撤销已有进程&#xff0c;实现进程状态转换等。 原语&#xff1a;进程控制用的程序段。执行期间不允许中断&#xff0c;用&#xff02;关中断&#xff02;和&#xff02;开中断&#xff02;指令&#xff08;特权指令&#xff09;实…

线性代数的本质(十一)——复数矩阵

文章目录 复数矩阵附录极大线性无关组向量叉积 复数矩阵 矩阵 A A A 的元素 a i j ∈ C a_{ij}\in\Complex aij​∈C &#xff0c;称为复矩阵。现将实数矩阵的一些概念推广到复数矩阵&#xff0c;相应的一些性质在复数矩阵同样适用。 定义&#xff1a;设复矩阵 A ( a i j…

Unity InputSystem 基础使用之鼠标交互

资料 官方文档 导入InputSystem包 Package Manager 搜索Input System进行下载启用该包&#xff0c;会重启Unity Editor 注意 InputSystem可以和旧版输入系统一起使用 设置&#xff1a;Project Settings->Player->Other Settings->Configuration->Active Input…

创建java文件 自动添加作者、时间等信息 – IDEA 技巧

2023 09 亲测 文章目录 效果修改位置配置信息 效果 每次创建文件的时候&#xff0c;自动加上作者、时间等信息 修改位置 打开&#xff1a;File —> Settings —> Editor —> File and Code Templates —> includes —> FileHeader 配置信息 /*** author : Java…

根号分治与多项式的巧妙结合:GYM-104386G

使用范围&#xff1a;序列上对于每种数的计数问题 考虑对每种数的出现次数进行根号分治 如果出现次数很少&#xff0c;直接平方暴力即可 如果很大考虑任意 ( i , j ) (i,j) (i,j)&#xff0c;我们拆一下&#xff0c;再移一下&#xff0c;然后就变成了卷积形式

zookeeper/HA集群配置

1.zookeep配置 1.1 安装4台虚拟机 &#xff08;1&#xff09;按照如下设置准备四台虚拟机&#xff0c;其中三台作为zookeeper&#xff0c;配置每台机器相应的IP&#xff0c;hostname&#xff0c;下载vim&#xff0c;ntpdate配置定时器定时更新时间&#xff0c;psmisc&#xff…

C++与C编译后符号表对比(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

k8s上线Java项目文件导出异常总结

⚡️: 部门后台上线 k8s &#xff0c;拉取 excel 文件时出现空指针异常&#xff0c;发现原因是 docker jar包部署缺少中文字体&#xff0c;所以出现无法导出 解决方法&#xff1a; 创建带有中文字体的jdk 镜像&#xff0c;并正确设置时区 FROM java:8u111-jdk-alpineLABEL m…

将钉钉机器人小程序从一个公司迁移至另一个公司的步骤

引言&#xff1a; 由于我们以前开发的钉钉小程序都在一个公司&#xff0c;想在想应用到另一个公司&#xff0c;这就牵扯出了关于钉钉小程序迁移方面的具体步骤。下面是具体步骤&#xff1a; 1、创建一个钉钉小程序 在这一步你需要有钉钉开放平台的开发者权限&#xff0c;具体…

更安全、更清晰、更高效——《C++ Core Guidelines解析》

由资深技术专家Rainer Grimm撰著的《C Core Guidelines解析》&#xff0c;从内容上说&#xff0c;选取了现代C语言最核心的相关规则;从篇幅上说&#xff0c;对软件工程师非常友好。以“八二原则”看&#xff0c;这个精编解析版是一-个非常聪明的选择。同时&#xff0c;Rainer G…

WPF Flyout风格动画消息弹出消息提示框

WPF Flyout风格动画消息弹出消息提示框 效果如图&#xff1a; XAML: <Window x:Class"你的名称控件.FlyoutNotication"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xam…

CTF入门学习笔记——Crypto密码(编码)

文章目录 CTF入门学习笔记——Crypto密码&#xff08;编码&#xff09;BASE编码BASE16BASE32BASE64BASE85[AFCTF 2018]BASE Uuencode编码[SWPUCTF 2021 新生赛]crypto8 Rabbit编码Rabbit URL编码URL Quoted-Printable编码Quoted-Printable 待补充 CTF入门学习笔记——Crypto密码…

PyCharm配置及使用Git教程

文章目录 1. 安装PyCharm2. 安装Git3. 在PyCharm中配置Git插件4. 连接远程仓库5. Clone项目代码6. 将本地文件提交到远程仓库6.1 git add6.2 git commit6.3 git push6.4 git pull 7. 代码回滚8. 分支操作8.1 新建分支8.2 切换分支8.3 合并分支8.4 删除分支 9. 解决本地和远程冲…

model加载模型部分参数

参考&#xff1a;pytorch 加载使用部分预训练模型(pretrained model)_在模型中使用了预训练模型作为一部分-CSDN博客PyTorch中model.state_dict()&#xff0c;model.modules()&#xff0c;model.children()&#xff0c;model.named_children()等含义_不吃饭就会放大招的博客-CS…

《TCP/IP网络编程》阅读笔记--I/O复用

目录 1--基于I/O复用的服务器 2--select()函数 3--基于I/O复用的回声服务器端 4--send()和recv()函数的常用可选项 5--readv()和writev()函数 1--基于I/O复用的服务器 多进程服务器端具有以下缺点&#xff1a;当有多个客户端发起连接请求时&#xff0c;就会创建多个进程来…

第27章_瑞萨MCU零基础入门系列教程之freeRTOS实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

企业架构LNMP学习笔记29

Nginx负载均衡配置&#xff1a; 架构分析&#xff1a; 1&#xff09;用户访问请求Nginx负载均衡服务器&#xff1b; 2&#xff09;Nginx负载均衡服务器再分发请求到Web服务器。 实际配置负载均衡&#xff0c;只需修改作为负载均衡服务器的Nginx即可&#xff0c;当前架构中的…

【android 蓝牙开发——蓝牙耳机】

【android 蓝牙开发——传统蓝牙】 【android 蓝牙开发——BLE&#xff08;低功耗&#xff09;蓝牙 2021-10-09更新】 总结一下蓝牙开发的基本使用以及蓝牙耳机的断开和链接。 所以需权限&#xff1a; <uses-permission android:name"android.permission.ACCESS_FIN…

微服务·架构组件之网关

微服务架构组件之网关 引言 微服务架构已成为构建大型和复杂应用程序的流行范式之一。在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;如果 客户端多次请求不同的微服务&#xff0c;会增加客户端代码和配置的复杂性&#xff0c;维护成本比较高。每…

用冒泡排序完成库函数qsort的作用

Hello&#xff0c;今天分享的是我们用冒泡函数实现qsort&#xff0c;也就是快排&#xff0c;之前我们也讲过库函数qsort的使用方法&#xff0c;今天我们尝试用冒泡函数实现一下&#xff0c;当然我们也见过qsort&#xff0c;后面也会继续完善的。这几天我是破防大学生&#xff0…