GDB - - - (GNU symbolic debugger)
是Linux平台下最常用的一款程序调试器。
gdb 是Linux平台下调用GDB调试器的 命令。
发展至今,GDB调试器已经对C、C++、Go、Objective-C、OpenCL、Ada 等多种编程语言提供了支持。实际场景中,GDB 更常用来调试 C 和 C++ 程序,虽然 Linux 平台下有很多能编写 C、C++ 代码的集成开发工具(IDE),但它们调试代码的能力往往都源自 GDB 调试器。
总的来说,借助GDB调试器可以实现以下几个功能:
1.程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量;
2.可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试;
3.程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误.
[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 的 Linux 发行版,安装方法通常有以下 2 种:
1. 直接调用该操作系统内拥有的 GDB 安装包,使用包管理器进行安装。此安装方式的好处是速度快,但通常情况下安装的并非 GDB 的最新版本;
2. 前往 GDB 官网下载源码包,在本机编译安装。此安装方式的好处是可以任意选择 GDB 的版本,但由于安装过程需要编译源码,因此安装速度较慢。
注意,不同的 Linux 发行版,管理包的工具也不同。根据维护团体(商业公司维护和社区组织维护)的不同,可以将众多 Linux 发行版分为 2 个系列,分别为 RedHat 系列和 Debian 系列。其中 RedHat 系列代表 Linux 发行版有 RedHat、CentOS、Fedora 等,使用 yum 作为包管理器;Debian 系列有 Debian、Ubuntu 等,使用 apt 作为包管理器。
首先我们以如下简单代码为例:
#include
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进行调试。
至此,我们的前期准备工作就做完了!!
在生成了包含调试信息的可执行文件 bug.exe 的基础上,我们可以启动GDB调试器如下:
我们会发现:该指令启动 GDB 调试器的同时,打印出了很多的免责条款。看着很是杂乱。怎么去掉呢?
上述几种方式都可以屏蔽掉免责条款启动 GDB 调试器,启动成功的标志就是:(gdb)
GDB调试教程