繁体   English   中英

GDB调试器的分段错误-C

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM