gdb是一个命令行下的、功能强大的调试器。

在学习 gdb 前,我们要知道几个最基本的 cmd 命令。

cmd

首先,对于 win10 系统,我们按 Windows + R 键,打开运行窗口,在里面输入 cmd,这样就可以打开 cmd 命令窗口了,是一个黑框。

接下来是一些最基本的命令。

  • F: 打开 F 盘;E: 打开 E 盘,等等

  • dir 查看文件夹中的文件

  • cd XXX.XXX 打开 XXX.XXX 文件

  • cd.. 返回上一级(文件夹)

  • cls 清屏(如果你觉得屏幕中的信息太多的话可以用这个命令)

  • ping [网址] 查看一个网站的信息(中括号不用打)

gdb 调试前的操作

在进行 gdb 调试之前,请先确保你安装了 gdb、g++、gcc 等。

首先,在 cmd 中进入到你的代码的文件夹页面,我的代码在 F 盘,如下图。

现在,我只要进入这个地址就行了。

要进行调试的文件是 ceshi.cpp,我们先在 cmd 中输入 g++ -g ceshi.cpp -o ceshi.exe 命令,然后等待一会,文件夹中就会出现一个名为 ceshi.exe 的文件。

之后输入 gdb 命令,会变成这样。

现在,我们用 file 命令来将刚才生成的 .exe 文件载入 gdb 调试器中,输入 file ceshi.exe(这里的 ceshi.exe 是刚才生成的 .exe 文件,你也可以起别的名字),如果出现下面的情况,就说明你成功了。

现在,我们就可以对这份代码进行调试了。

调试

这是 ceshi.cpp 里面的代码。

//The code was written by yifan, and yifan is neutral!!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define bug puts("NOIP rp ++!"); template<typename T>
inline T read() {
T x = 0;
bool fg = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
fg |= (ch == '-');
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return fg ? ~x + 1 : x;
} int a[10];
vector<int> s; void bre() {
int n = 10;
while (n --) {
puts("qwq");
}
} int main() {
int n = read<int>(), m = read<int>();
for (int i = 1; i <= 8; ++ i) {
a[i] = i;
s.emplace_back(i);
}
puts("AK IOI!");
bre();
puts("end!");
return 0;
}

我们要学会一些基础的命令。

  • r 运行代码,也就是我们平时的运行,你输入数据,它进行操作,最后输出。

  • l 查看代码,l [数字] 查看第几行附近的代码(取决于你输入的数字)

  • b [数字或函数名] 在第几行设置断点或者在函数处设置断点,代码运行到这一行时就会停下,函数名要带小括号,例如 main 函数就是 main()

  • c 从断点处继续运行至下一断点处或者程序结束处。

  • p [变量、数组名或者 STL 容器名] 查看变量、数组或者 STL 容器中的元素,如果数组或者 STL 中的元素过多,则只会显示大小。

  • d 断点编号 删除断点,i b 查看所有断点。

  • watch [变量或数组] 观测某个变量或数组,当这个变量或者数组中的元素出现变化时,程序就暂停,并给你显示变化,在程序运行后才可以使用。
(gdb) r // 运行
Starting program: F:\\8.7\ceshi.exe
[New Thread 10196.0x1b74]
[New Thread 10196.0x173c]
[New Thread 10196.0xe84] Thread 1 hit Breakpoint 1, main () at ceshi.cpp:36
36 n = read<int>(), m = read<int>(); // 碰到断点
(gdb) watch n // 添加监测变量 n
Hardware watchpoint 2: n
(gdb) c // 继续运行
Continuing.
2 3 Thread 1 hit Hardware watchpoint 2: n // n 的变化 Old value = 0
New value = 2
main () at ceshi.cpp:36
36 n = read<int>(), m = read<int>();
(gdb) watch a // 添加监测数组 a
Watchpoint 3: a
(gdb) c
Continuing.
Watchpoint 2 deleted because the program has left the block
in which its expression is valid. Thread 1 hit Watchpoint 3: a // a 的变化 Old value = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
New value = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}
New value = {0, 1, 2, 0, 0, 0, 0, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 0, 0, 0, 0, 0, 0, 0}
New value = {0, 1, 2, 3, 0, 0, 0, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 3, 0, 0, 0, 0, 0, 0}
New value = {0, 1, 2, 3, 4, 0, 0, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 3, 4, 0, 0, 0, 0, 0}
New value = {0, 1, 2, 3, 4, 5, 0, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 3, 4, 5, 0, 0, 0, 0}
New value = {0, 1, 2, 3, 4, 5, 6, 0, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 3, 4, 5, 6, 0, 0, 0}
New value = {0, 1, 2, 3, 4, 5, 6, 7, 0, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing. Thread 1 hit Watchpoint 3: a Old value = {0, 1, 2, 3, 4, 5, 6, 7, 0, 0}
New value = {0, 1, 2, 3, 4, 5, 6, 7, 8, 0}
main () at ceshi.cpp:39
39 s.emplace_back(i);
(gdb) c
Continuing.
AK IOI!
qwq
qwq
qwq
qwq
qwq
qwq
qwq
qwq
qwq
qwq
end!
[Thread 10196.0xe84 exited with code 0]
[Thread 10196.0x173c exited with code 0]
[Thread 10196.0x1b74 exited with code 0]
[Inferior 1 (process 10196) exited normally]
(gdb)
  • info watch 查看所有监测。

  • info locals 显示局部变量。

  • info f 显示当前栈的情况。

  • finish 完成函数。

  • call [函数名] 调用子函数。

  • n 从断点处开始,下一行,不进入子函数。

  • s 从断点处开始,下一行,进入子函数(包括快读、STL 的输入函数等等)。

  • return 忽略程序未完成的语句,强行返回。

  • whatis [变量名] 返回变量的数据类型。

  • set var [变量 = 数值] 强行给变量赋值。

  • q 退出。

End!

「学习笔记」gdb 调试的简单操作的更多相关文章

  1. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  2. 「学习笔记」Treap

    「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...

  3. 「学习笔记」字符串基础:Hash,KMP与Trie

    「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...

  4. 「学习笔记」平衡树基础:Splay 和 Treap

    「学习笔记」平衡树基础:Splay 和 Treap 点击查看目录 目录 「学习笔记」平衡树基础:Splay 和 Treap 知识点 平衡树概述 Splay 旋转操作 Splay 操作 插入 \(x\) ...

  5. 「学习笔记」FFT 之优化——NTT

    目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NT ...

  6. 「学习笔记」FFT 快速傅里叶变换

    目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...

  7. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  8. 「学习笔记」ST表

    问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主 ...

  9. 「学习笔记」递推 & 递归

    引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...

  10. 「学习笔记」动态规划 I『初识DP』

    写在前面 注意:此文章仅供参考,如发现有误请及时告知. 更新日期:2018/3/16,2018/12/03 动态规划介绍 动态规划,简称DP(Dynamic Programming) 简介1 简介2 ...

随机推荐

  1. 【Redis】-使用Lua脚本解决多线程下的超卖问题以及为什么?

    一.多线程下引起的超卖问题呈现1.1.我先初始化库存数量为1.订单数量为0 1.2.开启3个线程去执行业务 业务为:判断如果说库存数量大于0,则库存减1,订单数量加1 结果为:库存为-2,订单数量为3 ...

  2. office办公套件基础教程

    正文 1.网页端的应用-office全家桶 这里我选择先聊web端的应用,首先,我们来想象一下,只要你有网络,有浏览器,就能打开一个网页,在网页上进行编辑.处理一些word.报表.ppt等,你不需要复 ...

  3. Java动态调用实体的get方法

    /** * 动态调用实体的get方法(注意返回值) * @param dto 实体 * @param name 动态拼接字段 * @return {@link String} * @date 2021 ...

  4. React笔记-组件通信(六)

    React笔记-组件通信(六) props概念 props是组件之间通讯的纽带 props也是组件中内置的一个属性 通过父级组件传入 在类组件里 可以直接通过this.props获取 注意: prop ...

  5. Java设计模式简介(总结)

    Java设计模式简介(总结) 什么是设计模式 Java设计模式是一组经过验证的解决特定问题的编程技术,这些技术可以帮助开发人员快速.有效地开发高质量的软件.使用设计模式是为了可重用代码.让代码更容易被 ...

  6. 2020-11-02:go中,s:=make([]string,10);s=append(s,“test“);fmt.Println(s[0]),打印什么?

    福哥答案2020-11-02: 打印空字符串.s:=make([]string,10),s中已经有10个元素,append元素,s就有11个元素了.前10个元素没初始化,就是10个空字符串,最后1个字 ...

  7. AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变

    本图由AI生成 黄仁勋说的AI发展迎来iPhone时刻,对NVIDIA有什么影响? 文/王吉伟 近期的AIGC领域仍旧火爆异常. 但火的不只是AIGC应用,还有巨头之间的AI竞赛,以及接连不断上新的A ...

  8. 二进制部署k8s集群

    部署k8s有多种方式,本章我们采取二进制的部署方式来部署k8s集群,二进制部署麻烦点,但是可以在我们通过部署各个组件的时候,也通知能让我们更好的深入了解组件之间的关联,也利于后期维护 主机环境 系统: ...

  9. 2023 5.14 虚拟环境安装Linux

    1.安装配置VM虚拟机 vmare workstation 虚拟机是一款桌面计算机虚拟软件 让用户能够在单一主机上同事运行多个操作系统 1.每个虚拟操作系统的硬盘与数据都是独立 2.多台虚拟机可以构建 ...

  10. docker容器中下载vim指令的速度特别慢,解决方案

    1 首先要进入容器内执行,保存目前源 mv /etc/apt/sources.list /etc/apt/sources.list.bak 2修改源,由于docker默认没有vim的包 所以无法使用v ...