从零上手 GDB 调试,看这个教程就够了~

前言

在为 Linux 开发应用程序时,很多情况下都需要使用 C 语言进行开发,因此几乎每一位 Linux 程序员面临的首要问题都是:如何灵活运用 C 编译器。

目前 Linux 下最常用的 C 语言编译器是 GCCGCC 编译器是 GNU 开源组织发布的多平台编译器,它可以将 C、C++ 等多种语言编写的源程序编译、链接成可执行文件。而 GDB 是 GNU 推出的功能强大的程序调试器,可以说,GCC 与 GDB 是在 Linux 环境下进行 C 程序开发不可或缺的工具,也是 Linux 程序员必须掌握的技能之一。

GCC的历史

GNU 计划是由理查德·斯托曼在 1983 年 9 月 27 日公开发起的自由软件集体协作计划,主要目的是创建一个名叫 GNU’s Not Unix(GNU) 的完全免费的操作系统。该操作系统将包括绝大多数自由软件基金会所开发的其他软件,以对抗所有商业软件,而这个操作系统的核心(kernel)就叫 HURD。

但是 GNU 在开发完全免费的操作系统上并未取得成功,直到 20 世纪 90 年代由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)开发了 Linux 操作系统,GNU 才算在免费操作系统上完成了任务。虽然 GNU 计划在开发免费操作系统上不成功,但是却成功开发出几个广为流传的 GNU 软件,其中最著名的是GNU C Complier(GCC)

GCC 这个软件成为历史上最优秀的 C 语言编译器, 其执行效率与一般的编译器相比平均效率要高 20%~30%,使得那些靠贩卖编译器的公司大吃苦头,因为它们无法研制出与 GCC 同样优秀,却又完全免费、并开放源代码的编译器来。它还有一个十分特殊而且不同寻常的意义:几乎所有的自由软件都是通过它编译的。可以说,它是自由软件发展的基石与标杆。

现在,GCC 已经可以支持 7 种编程语言和 30 种编程结构,是学术界最受欢迎的编译工具。其他 GNU 软件还包括 GNU emacs、GNU Debugger(GDB)、GNU Bash 以及大部分 Linux 系统的程序库和工具等。目前,GCC 已发展到了 8.x 的版本,几乎所有开源软件和自由软件中都会用到,因此它的编译性能会直接影响到 Linux、Firefox、OpenOffice.org、Apache 以及一些数不清的小项目的开发。

GCC 无疑处在开源软件的核心地位,经过这么多年的发展,GCC 已经不仅仅能支持 C 语言,它现在还支持 Ada、C++、Java、Objective-C、Pascal、COBOL 以及函数式编程和逻辑编程的 Mercury 语言等。因此,现在的 GCC 已经变成了 GNU Compiler Collection,也即是 GNU 编译器套件的意思了。

初步使用GCC

GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过gcc命令就可以将源文件编译成可执行文件。GCC 既可以一次性完成 C 语言源文件的编译,也可以分步骤完成。

我们先完整演示如何一次性完成源文件的编译,让大家对 GCC 的使用有一个初步的了解。

以下面简单的 C 语言程序为例,打开 Sublime Text 输入代码,保存到桌面上,命名为 demo.c

#include <stdio.h>
int main()
{
    puts("shiyanlou");
    return 0;
}

生成可执行程序

在 Linux 下编译 C 语言程序,一般的 Linux 发行版都内建的有 GCC,无需用户再自行安装。打开 Xfce 终端,使用以下命令查看 GCC 版本:

gcc -v

输入以下命令,生成可执行程序文件:

$ cd Desktop #进入源文件所在目录
$ gcc demo.c #在 gcc 命令后面紧跟源文件

我们能够发现在桌面上多了一个名为 a.out 的文件,这就是最终生成的可执行文件。

这样我们就完成了编译和链接的过程。值得一提的是,Linux 不像 Windows 那样以文件后缀来区分可执行文件,Linux 下的可执行文件后缀理论上可以是任意的,这里的 .out 只是用来表明它是 GCC 的输出文件。不管源文件的名字是什么,GCC 生成的可执行文件的默认名字始终是 a.out

如果不想使用默认的文件名,那么可以通过 -o 选项来自定义文件名:

$ gcc demo.c -o demo.out

这样生成的可执行程序的名字就是 demo.out。可执行文件也可以不带后缀,因为 Linux 下可执行文件的后缀仅仅是一种形式上的:

$ gcc demo.c -o demo

这样生成的可执行程序的名字就是 demo

通过 -o 选项也可以将可执行文件输出到其他目录,并不一定非得在当前目录下,例如:

$ gcc democ -o ../demo.out

表示将可执行文件输出到上一层目录,并命名为 demo.out../ 表示上一层目录,如果不写,默认也是当前目录。这里的上一层目录是 shiyanlou,打开该目录能够看到生成的可执行文件 demo.out

运行可执行程序

既然我们已经生成了可执行程序,现在我们来学着如何运行它。执行以下命令:

$ ./a.out

./ 表示当前目录,整条命令的意思是运行当前目录下的 a.out 程序。如果不写./,Linux 会到系统路径下查找 a.out,而系统路径下显然不存在这个程序,所以会运行失败。

注意:如果程序没有执行权限,可以使用 sudo chmod 777 a.out 命令来增加权限。

到这里,一次完整的编译流程就结束了。以上内容出自实验楼课程——《GDB基础入门实战》。

课程通过动手实验学习 Linux 上 GCC 编译与 GDB 调试 C 语言程序的基本技巧。分别对 GCC 编译和 GDB 调试进行了详细介绍。

你将学习到:

课程地址:GDB 基础入门实战

posted @ 2020-06-12 16:44  蓝桥云课  阅读(790)  评论(0编辑  收藏  举报