在 Linux 中调试 C 程序的福音——gdb

每个程序员,无论经验如何丰富,都无法完全避免软件中出现bug的情况。因此,排查和修复bug成为软件开发周期中至关重要的任务之一。虽然有许多方法可以用来排查bug,例如测试和代码自审,但专用调试器软件也可以帮助准确地定位问题所在,以便进行修复。

对于那些使用C/C++编程语言或Fortran和Modula-2开发软件的程序员来说,有一款优秀的调试器工具——GDB,将会是他们的福音。GDB不仅可以帮助程序员更轻松地调试代码中的bug和其他问题,而且还提供了许多有用的功能和选项。在本文中,我们将讨论一些GDB调试器的基础知识,以及它所提供的一些实用功能和选项。

在 Linux 中调试 C 程序的福音——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:1111 tot = tot + 0xffffffff/out;(gdb)

登录后复制

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

(gdb) print out$1 = 5(gdb)

登录后复制

如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:

c

登录后复制

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

.........Breakpoint 1, main () at gdb-test.c:1111 tot = tot + 0xffffffff/out;(gdb) print out$2 = 99(gdb) cContinuing.Breakpoint 1, main () at gdb-test.c:1111 tot = tot + 0xffffffff/out;(gdb) print out$3 = 0(gdb)

登录后复制

现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。

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

(gdb) sProgram received signal SIGFPE, Arithmetic exception.0x080484aa in main () at gdb-test.c:1111 tot = tot + 0xffffffff/out;

登录后复制

是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:

(gdb) sProgram terminated with signal SIGFPE, Arithmetic exception.The program no longer exists.

登录后复制

通过这种方式,你就可以使用 GDB 调试你的程序。

总结

GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。

以上就是在 Linux 中调试 C 程序的福音——gdb的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2203086.html

(0)
上一篇 2025年2月26日 00:21:16
下一篇 2025年2月24日 16:33:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • pycharm如何终止程序运行

    在 PyCharm 中终止程序运行的方法有:快捷键:Windows/Linux:Ctrl + F2;macOS:⌘ + F2菜单栏:”运行” → “停止程序”工具栏图标:点击红色的正方形 &#…

    2025年2月26日
    200
  • pycharm怎么停止正在运行的代码

    在 PyCharm 中停止正在运行的代码的方法:识别正在运行的代码(绿色边框)并在窗口底部找到停止按钮(红色方框)。使用停止按钮、键盘快捷键 (Ctrl + F2 或 Cmd + F2) 或菜单选项(“运行” -> “停止”)来停止代…

    2025年2月26日
    200
  • pycharm中怎么运行ipynb文件

    要在 PyCharm 中运行 ipynb 文件,请:打开 ipynb 文件,创建 Python 环境(可选),运行代码单元格,使用交互式环境。 在 PyCharm 中运行 ipynb 文件 在 PyCharm 集成开发环境 (IDE) 中运…

    2025年2月26日
    200
  • pycharm中怎么运行一部分代码

    在 PyCharm 中运行部分代码有两种方法:运行选定代码块:选中代码并按 Ctrl + /(Windows/Linux)或 Cmd + /(macOS),选择“运行选定文本”。使用调试器:将光标放置在要运行的代码行上,按下 F9,单击“运…

    2025年2月26日
    200
  • pycharm中怎么运行py文件

    PyCharm 中运行 Py 文件有两种方法:通过菜单:点击“运行”菜单,选择“运行 ‘文件名’”。通过快捷键:使用 Shift + F10(Windows/Linux)或 Cmd + Shift + F10(mac…

    2025年2月26日
    200
  • pycharm中怎么运行脚本

    在 PyCharm 中运行脚本有四种方法:使用运行/调试配置。使用快捷键:Windows/Linux:Ctrl + Shift + F10;macOS:Cmd + Shift + F10。使用控制台:键入“python ”。使用调试器:设置…

    2025年2月26日
    200
  • pycharm如何运行单行代码

    PyCharm 运行单行代码:使用快捷键:Windows/Linux:Ctrl + Enter;macOS:Cmd + Enter通过菜单栏:”运行” > “运行选定行” 如何使用 Py…

    2025年2月26日
    200
  • pycharm怎么生成可执行文件

    可以通过 PyCharm 将 Python 脚本转换为可执行文件,以在没有 Python 解释器的情况下运行。步骤如下:创建或打开 Python 脚本。配置项目并选择正确的 Python 解释器。选择“Build”作为脚本类型。设置可执行文…

    2025年2月26日
    200
  • pycharm怎么修改目录

    修改 PyCharm 中的目录方法:打开项目并右键单击目录,选择“重命名”;按 Ctrl+F6 (Windows/Linux) 或 Cmd+F6 (macOS),在重命名对话框中输入新名称;在项目浏览器中右键单击目录,选择“移动”,浏览到新…

    2025年2月26日
    200
  • pycharm目录怎么调顺序

    需要调整 PyCharm 中目录顺序:1. 打开“项目结构”窗口(Ctrl/Cmd + Alt + Shift + S);2. 在“Modules”选项卡中找到“Sources”,拖动目录到所需位置;3. 点击“Apply”并“OK”保存更…

    2025年2月26日
    200

发表回复

登录后才能评论