GDB调试器的分段错误-C
我正在尝试使用GDB调试器“调试”这个程序。当我执行程序时,我得到了分段错误(内核转储)。 这是我第一次使用GDB,所以我真的不知道该使用什么命令,也不知道该期待什么 编辑:我知道错误是什么。我需要使用GDB调试器找到它 代码如下:GDB调试器的分段错误-C,c,debugging,segmentation-fault,gdb,C,Debugging,Segmentation Fault,Gdb,我正在尝试使用GDB调试器“调试”这个程序。当我执行程序时,我得到了分段错误(内核转储)。 这是我第一次使用GDB,所以我真的不知道该使用什么命令,也不知道该期待什么 编辑:我知道错误是什么。我需要使用GDB调试器找到它 代码如下: #include <stdio.h> int main() { int n, i; unsigned long long factorial = 1; printf("Introduzca un entero: ");
#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;
}
#包括
int main()
{
int n,i;
无符号长阶乘=1;
printf(“肠道介绍”);
scanf(“%d”,n);
if(n<0)
printf(“错误!不存在数字负数的阶乘”);
其他的
{
对于(i=0;i而言,问题在于:
scanf("%d",n);
正如您所写,n被声明为int类型的变量。您要做的是将n的地址而不是n本身传递到函数中
scanf("%d", &n);
要更好地理解scanf()的实现,请查看stdio.h
另外,设置n=1。否则,无论经过多少次循环,变量factorial都将保持为0
编辑:您要做的是访问用户传入的内存位置,该位置很可能映射到属于完全不同进程甚至操作系统的内存位置。分割错误的产生只是因为该位置不可访问。您可以在gdb中使用gdb t中的bto分段故障的堆栈跟踪
我知道错误是什么。我需要使用GDB调试器找到它
您需要阅读(并且您应该使用所有警告和调试信息编译源代码,例如,gcc-Wall-Wextra-g
;这会将调试信息放入可执行文件中)
GDB用户手册包含一个部分。您应该仔细阅读它,并在终端中试验GDB
。将帮助您逐步运行程序,并查询其状态(以及事后分析)。这样,您就可以了解发生了什么
不要期望我们重复教程部分中的内容
还可以尝试gdb-tui
选项
注意:不要指望StackOverflow告诉你什么是容易的、有很好文档记录的。你应该在询问之前找到并阅读文档。scanf(“%d”,n);
-->scanf(“%d”,n)
也i=0;
-->
i=1;我不是要求你直观地查找错误。我的意思是使用GDB调试器。无论你是否使用GDB,它都会给你分段错误。你是说如何使用GDB查找和跟踪问题?