主要回报后的分段错误

时间:2011-01-26 17:39:38

标签: c linux segmentation-fault main

我在Linux上有一个很长的程序,在主要返回后给我分段错误。 它是一个很长的程序,所以我不能发布它。那么你可以帮助我做出这样的错误吗?

谢谢。

哇,那些答案非常快。谢谢你们。 我想我已经解决了,我忘了使用malloc字符串并将其用作缓冲区。 现在我已经对它进行了编辑,它并没有发出分段错误的信号。

再一次,谢谢大家。

4 个答案:

答案 0 :(得分:3)

猜猜:你可能不小心破坏了主要的堆栈,所以丢失了返回地址。你有一个字符串缓冲区,你可能会超支吗?

如果没有,你应该尝试:

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

如果你的发行版有它们可能有助于安装glibc-debug软件包,因为那时你将使用glibc代码。

答案 1 :(得分:2)

在SIGSEGV信号上使用GDB和打印堆栈跟踪。然后至少发布 ,这样我们可以更有帮助。

如果你编译:

$ gcc -g prog.c -o prog

然后在GDB下运行:

$ gdb ./prog
gdb> r

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

gdb> bt

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

答案 2 :(得分:1)

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

MY2C

答案 3 :(得分:1)

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

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

如果没有,那么你已经在某处调用了未定义的行为,很可能以某种方式破坏了堆栈。有关那里的建议,请参阅Rup的答案。