gdb调试的简单操作总结

 更新时间:2023年08月07日 09:34:36   作者:yi_fan0305  
gdb是一个命令行下的、功能强大的调试器,这篇文章主要为大家详细介绍了gdb 调试的一些简单操作,感兴趣的小伙伴可以跟随小编一起了解一下

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 退出。

到此这篇关于gdb调试的简单操作总结的文章就介绍到这了,更多相关gdb调试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现火车订票系统

    C语言实现火车订票系统

    这篇文章主要为大家详细介绍了C语言实现火车订票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言超详细讲解排序算法上篇

    C语言超详细讲解排序算法上篇

    时间如流水,今天就到初阶数据结构最后一个知识章节了,常见的排序算法!在进入这期之前,程爱打篮球的程序猿想说一句,如果有不懂的地方可以反复观看我之前的内容,再还有不懂可以直接找我,帮你安排的妥妥的
    2022-03-03
  • c++与c中的数组初始化默认值如何为0

    c++与c中的数组初始化默认值如何为0

    这篇文章主要介绍了c++与c中的数组初始化默认值如何为0问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • OpenCV mask的作用及如何制作掩模mask

    OpenCV mask的作用及如何制作掩模mask

    mask 不是马斯克,是掩膜,可以用来遮盖非感兴趣区,突出感兴趣区,使得图像处理只专注于ROI部分,OpenCV中的很多函数用到mask,mask是什么?怎么制作一个mask?本文给大家分享OpenCV mask的作用及如何制作掩模mask,感兴趣的朋友一起看看吧
    2023-02-02
  • C语言实现简单的三子棋游戏源码

    C语言实现简单的三子棋游戏源码

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言跳转浏览器打开指定URL的操作代码

    C语言跳转浏览器打开指定URL的操作代码

    这篇文章主要介绍了C语言跳转浏览器打开指定URL,该代码使用sprintf()函数将要打开的URL添加到一个系统命令中,然后使用system()函数调用该命令以默认浏览器打开URL,需要的朋友可以参考下
    2023-04-04
  • C++之list容器介绍及使用方式

    C++之list容器介绍及使用方式

    这篇文章主要介绍了C++之list容器介绍及使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 快来领取!你想要的C++/C语言优秀书籍

    快来领取!你想要的C++/C语言优秀书籍

    如何选择合适的C++/C语言书籍,是不是已经眼花缭乱,不知道该选择哪本好了呢?今天我来为大家分享两本不可错过的优秀书籍
    2017-09-09
  • char str[] 与 char *str的区别详细解析

    char str[] 与 char *str的区别详细解析

    以下是对char str[]与char *str的区别进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • VS2019创建C++工程的的实现步骤

    VS2019创建C++工程的的实现步骤

    本文主要介绍了VS2019创建C++工程步骤,包含新建项目、编辑文件、配置源文件目录、编译链接、输出文件、设置断点调试,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12

最新评论