我正在尝试使用GDB调试器“调试”该程序。我执行程序时遇到Segmentation故障(核心转储)。 这是我第一次使用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;
}
答案 0 :(得分:1)
问题在于:
scanf("%d",n);
正如您所写,n被声明为int类型的变量。你想要做的是将n的地址而不是n本身传递给函数。
scanf("%d", &n);
为了更好地理解scanf()的实现,请查看stdio.h。
另外,设置n = 1.或者,无论你经历了多少循环,变量阶乘都将保持为0。
编辑:您要做的是访问用户传入的内存位置,这很可能映射到属于完全不同的进程甚至操作系统的内存位置。仅因为无法访问位置而生成分段错误。你在gdb中可以做的是在gdb中使用 bt 来实现分段错误的堆栈跟踪。
答案 1 :(得分:0)
我知道错误是什么。我需要使用GDB调试器
找到它
您需要阅读documentation of gdb
(您应该使用所有警告和调试信息编译源代码,例如gcc -Wall -Wextra -g
和GCC; DWARF调试可执行文件中的信息。
GDB用户手册包含Sample GDB session部分。您应仔细阅读,并在终端中试验gdb
。 debugger将帮助您逐步运行程序,并查询其状态(以及分析core
dumps验尸后)。因此,您将了解正在发生的事情。
不要指望我们重复该教程部分的内容。
还可以尝试gdb -tui
选项。
PS。不要期望StackOverflow能够告诉您什么是容易记录的。在询问SO之前,您需要查找和阅读文档。