Linux - gdb 调试(安装及简单使用)

什么是GDB?

GDB - - - (GNU symbolic debugger)
是Linux平台下最常用的一款程序调试器。

什么是gdb?

gdb 是Linux平台下调用GDB调试器的 命令

为啥要用GDB?

发展至今,GDB调试器已经对C、C++、Go、Objective-C、OpenCL、Ada 等多种编程语言提供了支持。实际场景中,GDB 更常用来调试 C 和 C++ 程序,虽然 Linux 平台下有很多能编写 C、C++ 代码的集成开发工具(IDE),但它们调试代码的能力往往都源自 GDB 调试器

总之就是:强就完事了~在这里插入图片描述

GDB调试器能做啥?

总的来说,借助GDB调试器可以实现以下几个功能:

1.程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量;

2.可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试;

3.程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误.

在这里插入图片描述

不清楚GDB是否安装?

基于 Linux 系统的免费、开源,衍生出了多个不同的 Linux 版本,比如 Redhat、CentOS、Ubuntu、Debian 等。这些 Linux 发行版中,有些默认安装有 GDB 调试器,但有些默认不安装。 判断当前 Linux 发行版是否安装有 GDB 的方法也很简单,就是在命令行窗口中执行 gdb -v 命令。

[stu@localhost Desktop]$ gdb -v
bash: gdb: command not found

如果是上述结果,表明当前系统上未装GDB调试器。反之,如果执行结果为:

[stu@localhost Desktop]$ gdb -v
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright © 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type “show copying”
and “show warranty” for details.
This GDB was configured as “i686-redhat-linux-gnu”.
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/.

则表明当前系统上安装了GDB调试器。

如何安装GDB调试器?

对于尚未安装 GDB 的 Linux 发行版,安装方法通常有以下 2 种:

1. 直接调用该操作系统内拥有的 GDB 安装包,使用包管理器进行安装。此安装方式的好处是速度快,但通常情况下安装的并非 GDB 的最新版本;
2. 前往 GDB 官网下载源码包,在本机编译安装。此安装方式的好处是可以任意选择 GDB 的版本,但由于安装过程需要编译源码,因此安装速度较慢。

注意,不同的 Linux 发行版,管理包的工具也不同。根据维护团体(商业公司维护和社区组织维护)的不同,可以将众多 Linux 发行版分为 2 个系列,分别为 RedHat 系列和 Debian 系列。其中 RedHat 系列代表 Linux 发行版有 RedHat、CentOS、Fedora 等,使用 yum 作为包管理器;Debian 系列有 Debian、Ubuntu 等,使用 apt 作为包管理器。

快速安装GDB

在这里插入图片描述

源码安装GDB

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简单使用GDB

首先我们以如下简单代码为例:

#include <stdio.h>

int main ()
{
    
    
    unsigned long long int n, sum;
    
    n = 1;
    sum = 0;
    while (n <= 100)
    {
    
    
        sum = sum + n;
        n = n + 1;
    }
    
    return 0;
}

此源码的路径为:/home/stu/Desktop/Tlhmw/0813/bug.c。

前期准备

通过前面的学习我们知道,GDB的主要功能就是监控程序的执行流程。
辣么,这也就意味着,只有当源程序文件被编译为可执行文件时,GDB才会派上用场。
以上面的源码(bug.c)为例:
我们需要对它进行编译,使它成为可执行程序:

在这里插入图片描述

可以看到,这里已经生成了 bug.c 对应的执行文件 bug.exe,
但值得一提的是,此文件不支持使用 GDB 进行调试。
原因很简单,使用 GDB 调试某个可执行文件,该文件中必须包含必要的调试信息(比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等),而上面生成的 bug.exe 则没有。

实践出真知,我们来看看上述exe文件究竟可不可就知道了:
在这里插入图片描述
我们可以看到用 gdb 命令时会提示:
no debugging symbols found(未找到调试符号信息)
我们在 (gdb) 后面输入命令: l (list:显示源程序代码的内容)时,会提示:
No symbol table is loaded.(未加载符号表)

结论是正确的在这里插入图片描述

那么如何生成符合 GDB 调试要求的可执行文件呢?
这个也简单,只需要使用 gcc -g 选项编译源文件,就可以了。

在这里插入图片描述

由此生成的 bug.exe 即可使用GDB进行调试。
至此,我们的前期准备工作就做完了!!

启动GDB调试器

在生成了包含调试信息的可执行文件 bug.exe 的基础上,我们可以启动GDB调试器如下:

在这里插入图片描述

我们会发现:该指令启动 GDB 调试器的同时,打印出了很多的免责条款。看着很是杂乱。怎么去掉呢?

我们可以通过添加 - -silent(或者 -q 、- -quiet)选项,将这部分信息屏蔽掉:
在这里插入图片描述

上述几种方式都可以屏蔽掉免责条款启动 GDB 调试器,启动成功的标志就是:(gdb)

接下来我们可以了解一下 (gdb) 后面都可以跟什么指令:
在这里插入图片描述

接下来我们进入实战来看看这些指令:
在这里插入图片描述
在这里插入图片描述

怎么样?是不是没有想象中那么难的。在这里插入图片描述

参考资料

GDB调试教程

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/108034475