【问题标题】:segmentation fault after main returns主返回后的分段错误
【发布时间】:2011-06-16 00:37:22
【问题描述】:

我在 Linux 上的 c 语言中有一个很长的程序,在 main 返回后给我带来了分段错误。 这是一个很长的程序,所以我不能发布它。那么你能帮我看看什么会导致这样的错误吗?

谢谢。

哇,这些答案来得真快。谢谢你们。 我想我解决了,我忘了 malloc 一个字符串并将其用作缓冲区。 现在我已经分配了它,它不会向我发出分段错误的信号。

再次感谢大家。

【问题讨论】:

  • 如果没有一行代码可以查看,我们不妨随机告诉您一个答案。然而,一般来说,是指针相关的东西(包括缓冲区溢出)或堆栈损坏。
  • 你声明你的 main 函数为返回 void 吗?
  • 您可能在代码中的某处浪费了一些内存 - 尝试在 valgrind 下运行。
  • 将您的代码发布到pastebin.com,以便所有人都能看到

标签: c linux segmentation-fault main


【解决方案1】:

猜测:您可能不小心损坏了 main 中的堆栈,因此它丢失了返回地址。你那里有一个可能会溢出的字符串缓冲区吗?

如果没有,你应该尝试:

  • 在 valgrind 下运行程序
  • 使用 gdb 调试程序以捕获崩溃并查看您当时所处的位置;您还可以调试转储的核心文件

如果您的发行版有 glibc-debug 软件包,安装它们可能会有所帮助,因为此时您将使用 glibc 代码。

【讨论】:

    【解决方案2】:

    使用 GDB 并在 SIGSEGV 信号上打印堆栈跟踪。然后至少在此处发布那个,这样我们就可以提供更多帮助。

    如果你编译了:

    $ gcc -g prog.c -o prog
    

    然后在GDB下运行:

    $ gdb ./prog
    gdb> r
    

    当您收到SIGSEGV 信号(分段错误)时,请执行以下操作:

    gdb> bt
    

    然后查看堆栈跟踪上的内容以了解导致分段错误的原因。

    【讨论】:

    • 非常有用的建议。试图基于另一个庞大系统进行开发的人,如果不进行这样的调试,总是找不到导致段错误的确切点。
    【解决方案3】:

    如果在 main() 返回后出现分段错误,通常意味着全局定义的事情出错了。这么少的信息很难帮助你。向我们发送更多信息!

    my2c

    【讨论】:

      【解决方案4】:

      如果它在main() 返回之后,那么根据标准,所有析构函数都已运行(尽管我不会把它放在一个实现中来捏造一些),除非函数atexit() 已被使用。该函数注册了一个函数,该函数将在main() 返回后有效地调用(如果我正在阅读 3.6.3 正确)。如果只是为了完整性,您可能会检查程序中某处是否有atexit

      根据您所说的“在主返回后”的含义,您可能会在程序崩溃时为静态对象运行析构函数。检查那些。 (另外,发布你观察到的让你认为是在main() 返回之后的内容。你可能错了。)

      如果不是,那么您在某处调用了未定义的行为,很可能以某种方式破坏了堆栈。请参阅 Rup 的答案以获取建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 2020-11-18
        • 1970-01-01
        相关资源
        最近更新 更多