如何通过 6 个简单步骤使用 gdb 调试 C 程序

举报
Tiamo_T 发表于 2021/09/30 18:38:43 2021/09/30
【摘要】 在本文中,让我们通过 6 个简单的步骤讨论如何使用 gdb 调试器调试 ac 程序。编写一个带有错误的示例 C 程序以进行调试要学习 C 程序调试,让我们创建以下 C 程序来计算和打印数字的阶乘。然而,为了我们的调试目的,这个 C 程序包含一些错误。$ vim factorial.c# include <stdio.h>int main(){ int i, num, j; printf ("...

在本文中,让我们通过 6 个简单的步骤讨论如何使用 gdb 调试器调试 ac 程序。

编写一个带有错误的示例 C 程序以进行调试

要学习 C 程序调试,让我们创建以下 C 程序来计算和打印数字的阶乘。然而,为了我们的调试目的,这个 C 程序包含一些错误。

$ vim factorial.c
# include <stdio.h>

int main()
{
	int i, num, j;
	printf ("Enter the number: ");
	scanf ("%d", &num );

	for (i=1; i<num; i++)
		j=j*i;    

	printf("The factorial of %d is %d\n",num,j);
}
$ cc factorial.c

$ ./a.out
Enter the number: 3
The factorial of 3 is 12548672

让我们在查看 gdb 中最有用的命令的同时对其进行调试。

步骤 1. 使用调试选项 -g 编译 C 程序

使用 -g 选项编译 C 程序。这允许编译器收集调试信息。

$ cc -g factorial.c

注意:上面的命令创建了一个 .out 文件,用于调试,如下所示。

步骤 2. 启动 gdb

启动 C 调试器 (gdb),如下所示。


$ gdb a.out

步骤 3. 在 C 程序中设置断点

Syntax:

break line_number

其他格式:

  • 中断 [file_name]:line_number
  • 中断 [file_name]:func_name

在 C 程序中放置您怀疑有错误的断点。在执行程序时,调试器会在断点处停止,并提示您进行调试。

所以在启动程序之前,让我们在我们的程序中放置以下断点。

break 10
Breakpoint 1 at 0x804846f: file factorial.c, line 10.

步骤 4. 在 gdb 调试器中执行 C 程序

run [args]

您可以使用 gdb 调试器中的 run 命令开始运行程序。您还可以通过 run args 为程序提供命令行参数。我们在这里使用的示例程序不需要任何命令行参数,所以让我们运行,并开始程序执行。

run
Starting program: /home/sathiyamoorthy/Debugging/c/a.out

一旦你执行了 C 程序,它就会一直执行到第一个断点,并提示你进行调试。

Breakpoint 1, main () at factorial.c:10
10			j=j*i;

您可以使用各种 gdb 命令来调试 C 程序,如以下部分所述。

步骤 5. 在 gdb 调试器中打印变量值

Syntax: print {variable}

Examples:
print i
print j
print num
(gdb) p i
$1 = 1
(gdb) p j
$2 = 3042592
(gdb) p num
$3 = 3
(gdb)

正如你在上面看到的,在 factorial.c 中,我们没有初始化变量 j。因此,它获得垃圾值,导致大量数字作为阶乘值。

通过用 1 初始化变量 j 来解决这个问题,编译 C 程序并再次执行它。

即使在此修复之后,factorial.c 程序中似乎还是存在一些问题,因为它仍然给出了错误的阶乘值。

因此,将断点放在第 10 行,然后按照下一节中的说明继续操作。

步骤 6. 继续,单步执行 – gdb 命令

当程序在断点处停止时,您可以选择三种 gdb 操作。它们一直持续到下一个断点、步进或步进下一个程序行。

  • c 或 continue:调试器将继续执行直到下一个断点。
  • n 或 next:调试器将下一行作为单条指令执行。
  • s 或 step:与 next 相同,但不将函数视为单个指令,而是进入函数并逐行执行。

通过继续或逐步完成,您可能会发现问题是因为我们没有在“for 循环”条件检查中使用 <=。因此,将其从 < 更改为 <= 将解决问题。

gdb 命令快捷方式

对于大多数频繁的 gdb 操作,请使用以下快捷方式。

  • l – 列表
  • p – 打印
  • c – 继续
  • s——步
  • ENTER:按回车键会再次执行之前执行的命令。

其他 gdb 命令

  • l 命令:在调试模式下使用 gdb 命令 l 或 list 打印源代码。使用 l line-number 查看特定行号(或) l function 查看特定函数。
  • bt: backtrack – 打印所有堆栈帧或最里面的 COUNT 帧的回溯。
  • help – 查看特定 gdb 主题的帮助 – help TOPICNAME。
  • quit——退出 gdb 调试器。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。