【问题标题】:Segmentation fault with GDB debugger - CGDB 调试器的分段错误 - C
【发布时间】:2018-03-26 18:22:41
【问题描述】:

我正在尝试使用 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); --> scanf("%d", &amp;n); 还有i=0; --> i=1;

标签: c debugging segmentation-fault gdb


【解决方案1】:

问题来了:

scanf("%d",n);

正如您所写,n 被声明为 int 类型的变量。您要做的是将 n 的地址而不是 n 本身传递给函数。

scanf("%d", &n);

为了更好地理解 scanf() 的实现,请查看 stdio.h。

另外,设置 n = 1。否则变量阶乘将保持为 0,无论您经历了多少次循环。

编辑:您要做的是访问用户传入的内存位置,该位置很可能映射到属于完全不同的进程甚至操作系统的内存位置。产生分段错误仅仅是因为该位置不可访问。您可以在 gdb 中执行的操作是在 gdb 中使用 bt 来跟踪分段错误的堆栈跟踪。

【讨论】:

  • 我不是要求您直观地找到错误。我的意思是使用 GDB 调试器。
  • 无论你是否使用 GDB,它都会给你分段错误。你的意思是如何使用GDB来查找跟踪问题?
【解决方案2】:

我知道错误是什么。我需要使用 GDB 调试器找到它

您需要阅读documentation of gdb(并且您应该使用所有警告和调试信息编译您的源代码,例如gcc -Wall -Wextra -gGCC;这会将DWARF 调试信息放入其中你的可执行文件)。

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

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

也可以试试gdb -tui 选项。

PS。不要指望 StackOverflow 会告诉你什么是容易且有据可查的。在询问 SO 之前,您应该找到并阅读文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2013-12-28
    • 2017-07-04
    • 2017-01-11
    • 2016-01-12
    • 2020-01-29
    • 2015-12-23
    相关资源
    最近更新 更多