我正在尝试使用GDB调试器"调试"该程序。我在执行程序时出现分段错误(核心转储)。这是我第一次使用 GDB,所以我真的不知道要使用什么命令或期望什么。
编辑:我知道错误是什么。我需要使用 GDB 调试器找到它
这是代码:
#include <stdio.h>
int main()
{
int n, i;
unsigned long long factorial = 1;
printf("Introduzca un entero: ");
scanf("%d",n);
if (n < 0)
printf("Error! Factorial de un numero negativo no existe.");
else
{
for(i=0; i<=n; ++i)
{
factorial *= i;
}
printf("Factorial de %d = %llu", n, factorial);
}
return 0;
}
这是问题所在:
scanf("%d",n);
正如您所写,n 被声明为 int 类型的变量。您要做的是将 n 的地址而不是 n 本身传递到函数中。
scanf("%d", &n);
为了更好地理解scanf()的实现,请查看stdio.h。
此外,设置 n = 1。否则,无论您经历了多少次循环,变量阶乘都将保持为 0。
编辑:您要做的是访问用户传入的内存位置,该位置极有可能映射到属于完全不同的进程甚至操作系统的内存位置。生成分段错误仅仅是因为位置不可访问。在 gdb 中你可以做的是在 gdb 中使用 bt 来跟踪分段错误的堆栈。
我知道错误是什么。我需要使用 GDB 调试器找到它
您需要阅读gdb
的文档 (并且您应该使用所有警告和调试信息编译源代码,例如 与海湾合作委员会gcc -Wall -Wextra -g
;这会将 DWARF 调试信息放在可执行文件中)。
GDB 用户手册包含 GDB 会话示例部分。您应该仔细阅读它,并在终端中gdb
进行实验。调试器将帮助您逐步运行程序,并查询其状态(以及分析core
转储)。因此,您将了解正在发生的事情。
不要指望我们重复该教程部分中的内容。
还可以尝试gdb -tui
选项。
不要指望StackOverflow会告诉你什么是容易和有据可查的。在询问SO之前,您应该找到并阅读文档。