您的位置 首页 电路

如安在Linux中运用gdb调试C程序

如何在Linux中使用gdb调试C程序-如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 – GDB – 可以帮你更轻松地调试代码 bug 以及其它问题。在这篇文章中,我们将讨论一下 GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。

不管多么有经历的程序员,开发的任何软件都不或许彻底没有 bug。因而,排查及修正 bug 成为软件开发周期中最重要的使命之一。有许多办法能够排查 bug(测验、代码自审等等),可是还有一些专用软件(称为调试器)能够协助精确定位问题的地点,以便进行修正。

假如你是 C/C++ 程序员,或许运用 Fortran 和 Modula-2 编程言语开发软件,那么你将会很愿意知道有这么一款优异的调试器 – GDB – 能够帮你更轻松地调试代码 bug 以及其它问题。在这篇文章中,咱们将评论一下 GDB 调试器的根底常识,包含它供给的一些有用的功用/选项。

在咱们开端之前,值得一提的是,文章中的一切阐明和示例都现已在 Ubuntu 14.04 LTS 中测验过。教程中的示例代码都是 C 言语写的;运用的 shell 为 bash(4.3.11);GDB 版别为 7.7.1。

GDB 调试器根底

浅显的讲,GDB 能够让你看到程序在履行进程时的内部流程,并帮你清晰问题的地点。咱们将在下一节经过一个有用的示例来评论 GDB 调试器的用法,但在此之前,咱们先来评论一些之后对你有协助的根本关键。

首要,为了能够顺畅运用相似 GDB 这样的调试器,你有必要以指定的办法编译程序,让编译器产生调试器所需的调试信息。例如,在运用 gcc 编译器(咱们将在本教程之后的章节用它来编译 C 程序示例)编译代码的时分,你需求运用 -g 指令行选项。 IT网,http://www.it.net.cn

想要了解 gcc 编译器手册页中关于 -g 指令行选项相关的内容,请看这儿。

下一步,保证在你的体系中现已装置 GDB 调试器。假如没有装置,并且你运用的是根据 Debian 的体系(如 Ubuntu),那么你就能够运用以下指令轻松装置该东西:

sudo apt-get install gdb

在其他发行版上的装置办法,请看这儿。

现在,当你依照上述的办法编译完程序(gcc -g 指令行选项),一起也现已装置好 GDB 调试器,那么你就能够运用以下指令让程序在调试形式中运转:

gdb [可履行程序的称号]

这样做会初始化 GDB 调试器,但你的可履行程序此刻还不会被发动。在这个时分你就能够界说调试相关的设置。例如,你能够在特定行或函数中设置一个断点让 GDB 在该行暂停程序的履行。

接着,为了发动你的程序,你有必要输入履行以下 gdb 指令:

run

在这儿,值得一提的是,假如你的程序需求一些指令行参数,那么你能够在这儿指定这些参数。例如:

run [参数]

GDB 供给了许多有用的指令,在调试的时分总是能派的上用场。咱们将在下一节评论其间一部分指令。 IT网,http://www.it.net.cn

GDB 调试器用例

现在咱们对 GDB 及其用法有了根本的概念。因而,让咱们举例来运用所学的常识。这是一段示例代码:

#include

int main()

{

int out = 0, tot = 0, cnt = 0;

int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};

while(cnt < 10)

{

out = val[cnt];

tot = tot + 0xffffffff/out;

cnt++;

}

printf(“\n Total = [%d]\n”, tot);

return 0;

}

简略阐明一下这段代码要做什么事。获取 val 数组中每一个值,将其赋值给 out 变量,然后将 tot 之前的值与 0xffffffff/out 的成果值累加,赋值给 tot 变量。

这儿遇到的问题是,当履行这段代码编译后的可履行程序时,产生以下过错:

$ ./gdb-test

Floating point excepTIon (core dumped)

因而,要调试这段代码,榜首步是运用 -g 选项编译程序。指令如下:

gcc -g -Wall gdb-test.c -o gdb-test

接着,让咱们运转 GDB 调试器并指定要调试的可履行程序。指令如下:

gdb ./gdb-test

现在,我方才得到的过错是 FloaTIng point excepTIon,大部分人或许现已知道,这是由于 n % x,当 x 为 0 时导致的过错。所以,考虑到这一点,我在 11 行代码除法运算的方位处添加了一个断点。如下: IT网,http://www.it.net.cn

Linux学习,http:// linux.it.net.cn

(gdb)&;break 11

留意 (gdb) 是调试器的提示信息,我只输入了 break 11 指令。

现在,让 GDB 开端运转程序: IT网,http://www.it.net.cn

run IT网,http://www.it.net.cn

当断点榜首次被射中时,GDB 显现如下输出:

Breakpoint 1, main () at gdb-test.c:1111 tot = tot + 0xffffffff/out;(gdb)

正如你所看到的那样,调试器会显现断点地点的行代码。现在,让咱们打印出此刻 out 的值。如下:

(gdb) print out

$1 = 5

(gdb)

如上所示,值 5 被打印出来了。这个时分一切都仍是正常的。让调试器持续履行程序直到射中下一个断点,能够经过运用 c 指令来完结:

c

重复上述操作,直到 out 值变为 0 时。

IT网,http://www.it.net.cn

Breakpoint 1, main () at gdb-test.c:11

11 tot = tot + 0xffffffff/out;

(gdb) print out

$2 = 99

(gdb) c

ConTInuing.

Breakpoint 1, main () at gdb-test.c:11

11 tot = tot + 0xffffffff/out;

(gdb) print out

$3 = 0

(gdb)

现在,为了进一步承认问题,我运用 GDB 的 s(或 step) 指令替代 c 指令。由于,我只想让当时程序在第 11 行之后暂停,再一步步履行,看看这个时分是否会产生溃散。

以下是履行之后输出信息:

(gdb) s

Program received signal SIGFPE, Arithmetic exception.

0x080484aa in main () at gdb-test.c:11

11 tot = tot + 0xffffffff/out;

是的,如上输出的榜首行内容所示,这便是抛出反常的当地。当我再次测验运转 s 指令时,问题终究也得到了承认:

(gdb) s

Program terminated with signal SIGFPE, Arithmetic exception.

The program no longer exists.

经过这种办法,你就能够运用 GDB 调试你的程序。 Linux学习,http:// linux.it.net.cn

总结

GDB 供给了许多功用供用户研讨和运用,在这儿,咱们仅仅只介绍了很少一部分内容。经过 GDB 的手册页能够进一步了解这个东西,当你在调试代码的时分,测验运用一下它。GDB 调试器有必定的学习难度,可是它很值得你下功夫学习。

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/88768.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部