每个程序员,无论经验如何丰富,都无法完全避免软件中出现bug的情况。因此,排查和修复bug成为软件开发周期中至关重要的任务之一。虽然有许多方法可以用来排查bug,例如测试和代码自审,但专用调试器软件也可以帮助准确地定位问题所在,以便进行修复。
对于那些使用C/C++编程语言或Fortran和Modula-2开发软件的程序员来说,有一款优秀的调试器工具——GDB,将会是他们的福音。GDB不仅可以帮助程序员更轻松地调试代码中的bug和其他问题,而且还提供了许多有用的功能和选项。在本文中,我们将讨论一些GDB调试器的基础知识,以及它所提供的一些实用功能和选项。

在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在 Ubuntu 14.04 LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的 shell 为 bash(4.3.11);GDB 版本为 7.7.1。
GDB 调试器基础
通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。
首先,为了能够顺利使用类似 GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用 gcc 编译器(我们将在本教程之后的章节用它来编译 C 程序示例)编译代码的时候,你需要使用-g 命令行选项。
想要了解 gcc 编译器手册页中关于 -g 命令行选项相关的内容,请看这里。
下一步,确保在你的系统中已经安装 GDB 调试器。如果没有安装,而且你使用的是基于 Debian 的系统(如 Ubuntu),那么你就可以使用以下命令轻松安装该工具:
sudo apt-get install gdb
在其他发行版上的安装方法,请看这里。
现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好 GDB 调试器,那么你就可以使用以下命令让程序在调试模式中运行:
gdb [可执行程序的名称]
这样做会初始化 GDB 调试器,但你的可执行程序此时还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让 GDB 在该行暂停程序的执行。
接着,为了启动你的程序,你必须输入执行以下 gdb 命令:
run
在这里,值得一提的是,如果你的程序需要一些命令行参数,那么你可以在这里指定这些参数。例如:
run [参数]
GDB 提供了很多有用的命令,在调试的时候总是能派的上用场。我们将在下一节讨论其中一部分命令。
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 printf("/n Total = [%d]/n", tot); return 0; }
简单说明一下这段代码要做什么事。获取 val数组中每一个值,将其赋值给out 变量,然后将tot 之前的值与0xffffffff/out 的结果值累加,赋值给 tot 变量。
这里遇到的问题是,当执行这段代码编译后的可执行程序时,产生以下错误:
$ ./gdb-testFloating 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 行代码除法运算的位置处添加了一个断点。如下:
(gdb)&;break 11
注意 (gdb) 是调试器的提示信息,我只输入了break 11 命令。
现在,让 GDB 开始运行程序:
run
当断点第一次被命中时,GDB 显示如下输出:
Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb)
正如你所看到的那样,调试器会显示断点所在的行代码。现在,让我们打印出此时out 的值。如下:
(gdb) print out $1 = 5 (gdb)
如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:
c
重复上述操作,直到 out值变为0 时。
... ... ... 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 调试你的程序。
总结
GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。
以上是在 Linux 中调试 C 程序的福音——gdb的详细内容。更多信息请关注PHP中文网其他相关文章!

Linux操作系统的核心是其命令行界面,通过命令行可以执行各种操作。1.文件和目录操作使用ls、cd、mkdir、rm等命令管理文件和目录。2.用户和权限管理通过useradd、passwd、chmod等命令确保系统安全和资源分配。3.进程管理使用ps、kill等命令监控和控制系统进程。4.网络操作包括ping、ifconfig、ssh等命令配置和管理网络连接。5.系统监控和维护通过top、df、du等命令了解系统运行状态和资源使用情况。

介绍 Linux是一个强大的操作系统,由于其灵活性和效率,开发人员,系统管理员和电源用户都喜欢。但是,经常使用长而复杂的命令可能是乏味的

Linux适用于服务器、开发环境和嵌入式系统。1.作为服务器操作系统,Linux稳定高效,常用于部署高并发应用。2.作为开发环境,Linux提供高效的命令行工具和包管理系统,提升开发效率。3.在嵌入式系统中,Linux轻量且可定制,适合资源有限的环境。

简介:通过基于Linux的道德黑客攻击数字边界 在我们越来越相互联系的世界中,网络安全至关重要。 道德黑客入侵和渗透测试对于主动识别和减轻脆弱性至关重要

Linux基础学习从零开始的方法包括:1.了解文件系统和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.学习文件操作,如创建和编辑文件,4.探索高级用法如管道和grep命令,5.掌握调试技巧和性能优化,6.通过实践和探索不断提升技能。

Linux在服务器、嵌入式系统和桌面环境中的应用广泛。1)在服务器领域,Linux因其稳定性和安全性成为托管网站、数据库和应用的理想选择。2)在嵌入式系统中,Linux因其高度定制性和高效性而受欢迎。3)在桌面环境中,Linux提供了多种桌面环境,满足不同用户需求。

Linux的缺点包括用户体验、软件兼容性、硬件支持和学习曲线。1.用户体验不如Windows或macOS友好,依赖命令行界面。2.软件兼容性不如其他系统,缺乏许多商业软件的原生版本。3.硬件支持不如Windows全面,可能需要手动编译驱动程序。4.学习曲线较陡峭,掌握命令行操作需要时间和耐心。

Linuxisnothardtolearn,butthedifficultydependsonyourbackgroundandgoals.ForthosewithOSexperience,especiallycommand-linefamiliarity,Linuxisaneasytransition.Beginnersmayfaceasteeperlearningcurvebutcanmanagewithproperresources.Linux'sopen-sourcenature,bas


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
视觉化网页开发工具