如何通过 6 个简单步骤使用 gdb 调试 C 程序
在本文中,让我们通过 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 调试器。
- 点赞
- 收藏
- 关注作者
评论(0)