我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在Linux中怎么使用gdb调试C程序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在Linux中怎么使用gdb调试C程序

这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。

无论多么有经验的程序员,开发的任何软件都不可能完全没有 bug。因此,排查及修复 bug 成为软件开发周期中最重要的任务之一。有许多办法可以排查  bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。

在Linux中怎么使用gdb调试C程序

如果你是 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 命令行选项。

想要了解 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 < 10) { out = val[cnt]; tot = tot + 0xffffffff/out; 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:  1111 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:  1111 tot = tot + 0xffffffff/out;

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

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

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

以上是“在Linux中怎么使用gdb调试C程序”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在Linux中怎么使用gdb调试C程序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在Linux中怎么使用gdb调试C程序

这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。无论多么有经验的程序员,开发的任
2023-06-16

linux中怎么使用gdb调试程序

在Linux中使用gdb调试程序,可以按照以下步骤进行操作:1. 在命令行中编译你的程序时,加上`-g`选项,以便生成调试信息。例如:`gcc -g myprogram.c -o myprogram`2. 打开终端,输入`gdb`命令,进入
2023-09-13

Linux程序调试工具gdb怎么使用

这篇文章主要介绍“Linux程序调试工具gdb怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux程序调试工具gdb怎么使用”文章能帮助大家解决问题。gdb是GNU开源组织发布的一个强大
2023-06-27

在Linux系统中使用GDB来调试C++程序的方法

这篇文章主要讲解了“在Linux系统中使用GDB来调试C++程序的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统中使用GDB来调试C++程序的方法”吧!安装GDB大多数的
2023-06-13

Linux系统中gdb程序调试工具怎么用

这篇文章主要为大家展示了“Linux系统中gdb程序调试工具怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统中gdb程序调试工具怎么用”这篇文章吧。  一、常规调试  gdb是
2023-06-13

Linux系统下如何使用GDB调试程序

本文将为大家详细介绍“Linux系统下如何使用GDB调试程序”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统下如何使用GDB调试程序”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容
2023-06-28

Linux如何使用gdb调试多进程

这篇文章主要介绍了Linux如何使用gdb调试多进程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux如何使用gdb调试多进程文章都会有所收获,下面我们一起来看看吧。一.gdb常用目录表操作描述l命令相当
2023-06-28

怎么使用gdb调试php

今天给大家介绍一下怎么使用gdb调试php。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。使用gdb调试php简介gdb 是c语言的代码调试工具可以用来调试ph
2023-06-29

vscode中怎么远程gdb调试?方法详解

vscode中怎么远程gdb调试?下面本篇文章给大家介绍一下vscode远程gdb调试的方法,希望对大家有所帮助!最近在同事的安利下,尝试了用 vscode 做 gdb 调试,用完之后,“真香”。话不多说,本文要实现的是:在 windows
2023-10-22

怎么使用Flex调试程序

这篇文章主要为大家展示了“怎么使用Flex调试程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Flex调试程序”这篇文章吧。使用Flex调试程序如果Flex程序编译时报错,需要修改程序
2023-06-17

c语言怎么调试程序

调试 c 程序需要以下步骤:1. 使用断点暂停执行;2. 打印语句输出变量值;3. 单步执行程序;4. 使用 gdb 查看高级调试信息;5. 检查内存错误;6. 仔细审查代码。如何调试 C 程序当 C 程序出现问题时,调试是找出错误并修复
c语言怎么调试程序
2024-05-15

​C#怎么使用WinExec调用exe程序

在C#中,可以使用Process.Start方法来调用外部的可执行程序。例如,要调用一个名为test.exe的可执行文件,可以使用以下代码:csharpusing System;using System.Diagnostics;class
2023-10-23

怎么使用C#/.net程序调用Python

这篇文章主要介绍了怎么使用C#/.net程序调用Python的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用C#/.net程序调用Python文章都会有所收获,下面我们一起来看看吧。C#/.net程序调用
2023-07-05

怎么使用eclipse进行程序调试

使用Eclipse进行程序调试的步骤如下:1. 在Eclipse中打开要调试的Java项目,并确保项目已经编译成功。2. 在代码中设置断点。在你希望程序停下来进行调试的地方,单击行号区域即可设置断点。断点会在行号处显示一个小蓝点。3. 单击
2023-09-13

Linux应用程序使用写文件调试程序的方法

linux,一切皆文件,那么在android系统本身,也是Linux+java罢了,也是在Linux的运行环境下。 通常,我们在调试程序的都会使用printf。 在Android中,我们会去使用logcat,现在,给大家介绍一种常用的调试方
2022-06-04

编程热搜

目录