在_Linux_中如何使用_gdb_调试_C_程序
2017-06-05 00:00
489 查看
摘要:无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。
无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。
如果你是C/C++程序员,或者使用Fortran和Modula-2编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器-GDB-可以帮你更轻松地调试代码bug以及其它问题。在这篇文章中,我们将讨论一下GDB调试器的基础知识,包括它提供的一些有用的功能/选项。
在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu14.04LTS中测试过。教程中的示例代码都是C语言写的;使用的shell为bash(4.3.11);GDB版本为7.7.1。
首先,为了能够顺利使用类似GDB这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用gcc编译器(我们将在本教程之后的章节用它来编译C程序示例)编译代码的时候,你需要使用-g命令行选项。
想要了解gcc编译器手册页中关于-g命令行选项相关的内容,请看这里。
下一步,确保在你的系统中已经安装GDB调试器。如果没有安装,而且你使用的是基于Debian的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具:
sudoapt-getinstallgdb
在其他发行版上的安装方法,请看这里。
现在,当你按照上述的方式编译完程序(gcc-g命令行选项),同时也已经安装好GDB调试器,那么你就可以使用以下命令让程序在调试模式中运行:
gdb[可执行程序的名称]
这样做会初始化GDB调试器,但你的可执行程序此时还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让GDB在该行暂停程序的执行。
接着,为了启动你的程序,你必须输入执行以下gdb命令:
run
在这里,值得一提的是,如果你的程序需要一些命令行参数,那么你可以在这里指定这些参数。例如:
run[参数]
GDB提供了很多有用的命令,在调试的时候总是能派的上用场。我们将在下一节讨论其中一部分命令。
#include<stdio.h>
intmain()
{
intout=0,tot=0,cnt=0;
intval[]={5,54,76,91,35,27,45,15,99,0};
while(cnt<10)
{
out=val[cnt];
tot=tot+0xffffffff/out;
cnt++;
}
printf("\nTotal=[%d]\n",tot);
return0;
}
简单说明一下这段代码要做什么事。获取val数组中每一个值,将其赋值给out变量,然后将tot之前的值与0xffffffff/out的结果值累加,赋值给tot变量。
这里遇到的问题是,当执行这段代码编译后的可执行程序时,产生以下错误:
$./gdb-test
Floatingpointexception(coredumped)
因此,要调试这段代码,第一步是使用-g选项编译程序。命令如下:
gcc-g-Wallgdb-test.c-ogdb-test
接着,让我们运行GDB调试器并指定要调试的可执行程序。命令如下:
gdb./gdb-test
现在,我刚才得到的错误是Floatingpointexception,大部分人可能已经知道,这是因为n%x,当x为0时导致的错误。所以,考虑到这一点,我在11行代码除法运算的位置处添加了一个断点。如下:
(gdb)&;break11
注意(gdb)是调试器的提示信息,我只输入了break11命令。
现在,让GDB开始运行程序:
当断点第一次被命中时,GDB显示如下输出:
正如你所看到的那样,调试器会显示断点所在的行代码。现在,让我们打印出此时out的值。如下:
(gdb)printout
$1=5
(gdb)
如上所示,值5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用c命令来完成:
c
重复上述操作,直到out值变为0时。
...
...
...
Breakpoint1,main()atgdb-test.c:11
11tot=tot+0xffffffff/out;
(gdb)printout
$2=99
(gdb)c
Continuing.
Breakpoint1,main()atgdb-test.c:11
11tot=tot+0xffffffff/out;
(gdb)printout
$3=0
(gdb)
现在,为了进一步确认问题,我使用GDB的s(或step)命令代替c命令。因为,我只想让当前程序在第11行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。
以下是执行之后输出信息:
(gdb)s
ProgramreceivedsignalSIGFPE,Arithmeticexception.
0x080484aainmain()atgdb-test.c:11
11tot=tot+0xffffffff/out;
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s命令时,问题最终也得到了确认:
(gdb)s
ProgramterminatedwithsignalSIGFPE,Arithmeticexception.
Theprogramnolongerexists.
通过这种方式,你就可以使用GDB调试你的程序。
原文发布时间为:2017-02-04
本文来自云栖社区合作伙伴“Linux中国”
原文链接
无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。
如果你是C/C++程序员,或者使用Fortran和Modula-2编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器-
在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu14.04LTS中测试过。教程中的示例代码都是C语言写的;使用的shell为bash(4.3.11);GDB版本为7.7.1。
GDB调试器基础
通俗的讲,GDB可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论GDB调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。首先,为了能够顺利使用类似GDB这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用gcc编译器(我们将在本教程之后的章节用它来编译C程序示例)编译代码的时候,你需要使用
想要了解gcc编译器手册页中关于
下一步,确保在你的系统中已经安装GDB调试器。如果没有安装,而且你使用的是基于Debian的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具:
在其他发行版上的安装方法,请看
现在,当你按照上述的方式编译完程序(gcc
这样做会初始化GDB调试器,但你的可执行程序此时还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让GDB在该行暂停程序的执行。
接着,为了启动你的程序,你必须输入执行以下gdb命令:
在这里,值得一提的是,如果你的程序需要一些命令行参数,那么你可以在这里指定这些参数。例如:
GDB提供了很多有用的命令,在调试的时候总是能派的上用场。我们将在下一节讨论其中一部分命令。
GDB调试器用例
现在我们对GDB及其用法有了基本的概念。因此,让我们举例来应用所学的知识。这是一段示例代码:简单说明一下这段代码要做什么事。获取
这里遇到的问题是,当执行这段代码编译后的可执行程序时,产生以下错误:
因此,要调试这段代码,第一步是使用
接着,让我们运行GDB调试器并指定要调试的可执行程序。命令如下:
现在,我刚才得到的错误是
注意
现在,让GDB开始运行程序:
run
当断点第一次被命中时,GDB显示如下输出:
Breakpoint1,main()atgdb-test.c:11
11tot=tot+0xffffffff/out;
(gdb)
正如你所看到的那样,调试器会显示断点所在的行代码。现在,让我们打印出此时
如上所示,值
重复上述操作,直到
现在,为了进一步确认问题,我使用GDB的
以下是执行之后输出信息:
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行
通过这种方式,你就可以使用GDB调试你的程序。
总结
GDB提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过GDB的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB调试器有一定的学习难度,但是它很值得你下功夫学习。原文发布时间为:2017-02-04
本文来自云栖社区合作伙伴“Linux中国”
相关文章推荐
- 在 Linux 中如何使用 gdb 调试 C 程序
- 如何使用linux下gdb来调试python程序
- Linux:如何使用gdb调试多进程多线程程序
- 如何使用arm-eabi-gdb调试android c/c++程序
- 如何使用gdb调试C程序
- 在Linux的控制台中使用GDB调试程序
- Linux下使用GDB调试程序
- 如何在linux环境下调试JAVA程序使用访问timesten:
- Linux下如何用GDB调试c++程序
- 用vs2008编写和调试linux程序 ----VisualGDB 使用教程
- linux应用编程笔记(1)gdb调试方法及如何找出dbg.c程序中的错误
- 如何使用gdb调试程序
- GDB使用进阶-Linux程序调试利器
- Linux下使用GDB调试程序的方法
- linux下如何用GDB调试c++程序
- linux下如何用GDB调试c++程序
- linux c/c++ 第一次使用GDB调试小小程序
- 如何使用gdb调试程序
- linux下如何用GDB调试c++程序
- linux下使用gdb调试nasm程序