主返回后的分段错误

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

谢谢。

哇,这些答案真的很快。 谢谢你们。 我想我解决了,我忘了malloc一个string,并将其用作缓冲区。 现在我已经把它绑定了,它并没有给我一个分段错误的信号。

再一次,谢谢大家。

Solutions Collecting From Web of "主返回后的分段错误"

猜测:你可能会意外地损坏了堆栈,所以它丢失了返回地址。 你有一个字符串缓冲区,你可能会超出?

如果没有,你应该尝试:

  • 在valgrind下运行程序
  • 用gdb调试程序来捕捉崩溃,看看你在哪里; 你也可以调试转储的核心文件

如果您的发行版包含glibc-debug包,可能会有所帮助,因为您将在此时使用glibc代码。

使用GDB并在SIGSEGV信号上打印堆栈跟踪。 那么至少在这里发布这样我们可以更有帮助。

只要你编译:

$ gcc -g prog.c -o prog 

然后在GDB下运行它:

 $ gdb ./prog gdb> r 

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

 gdb> bt 

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

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

MY2C

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

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

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