[英]Segmentation fault with GDB debugger - C
我正在尝试使用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。
编辑:您想要做的是访问用户传递的内存位置,该位置很可能映射到属于完全不同的进程甚至OS的内存位置。 仅由于无法访问位置而产生分段错误。 您可以在gdb中执行的操作是在gdb中使用bt来跟踪分段错误的堆栈跟踪。
我知道错误是什么。 我需要使用GDB调试器找到它
您需要阅读gdb
的文档 (并且应该使用所有警告和调试信息来编译源代码,例如,带有GCC的 gcc -Wall -Wextra -g
;这会将DWARF调试信息放入可执行文件中)。
GDB用户手册包含示例GDB会话部分。 您应该仔细阅读,并在终端中尝试gdb
。 调试器将帮助您逐步运行程序,并查询程序的状态(并在事后分析core
转储 )。 这样,您将了解发生了什么。
不要指望我们重复该教程部分中的内容。
也尝试使用gdb -tui
选项。
PS。 不要指望StackOverflow会告诉您什么是容易且有据可查的。 您应该在询问SO之前找到并阅读文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.