GDB调试器的分段错误 - C.

时间:2017-10-14 22:13:14

标签: c debugging segmentation-fault gdb

我正在尝试使用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;
}

2 个答案:

答案 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 -gGCC; DWARF调试可执行文件中的信息。

GDB用户手册包含Sample GDB session部分。您应仔细阅读,并在终端中试验gdbdebugger将帮助您逐步运行程序,并查询其状态(以及分析core dumps验尸后)。因此,您将了解正在发生的事情。

不要指望我们重复该教程部分的内容。

还可以尝试gdb -tui选项。

PS。不要期望StackOverflow能够告诉您什么是容易记录的。在询问SO之前,您需要查找和阅读文档。