我在Linux上有一个很长的程序,在主要返回后给我分段错误。 它是一个很长的程序,所以我不能发布它。那么你可以帮助我做出这样的错误吗?
谢谢。
哇,那些答案非常快。谢谢你们。 我想我已经解决了,我忘了使用malloc字符串并将其用作缓冲区。 现在我已经对它进行了编辑,它并没有发出分段错误的信号。再一次,谢谢大家。
答案 0 :(得分:3)
如果没有,你应该尝试:
如果你的发行版有它们可能有助于安装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的答案。