我在Linux上有一個很長的程序,在主返回後給我分段錯誤。 它是一個很長的程序,所以我不能發佈它。那麼你能幫我什麼可以做出這樣的錯誤?主要返回後的分段錯誤
謝謝。
哇,這些答案真的很快。謝謝你們。 我想我解決了它,我忘了malloc一個字符串,並將其用作緩衝區。 現在我已經配合它,它不會以分段錯誤告訴我。
再一次,謝謝大家。
我在Linux上有一個很長的程序,在主返回後給我分段錯誤。 它是一個很長的程序,所以我不能發佈它。那麼你能幫我什麼可以做出這樣的錯誤?主要返回後的分段錯誤
謝謝。
哇,這些答案真的很快。謝謝你們。 我想我解決了它,我忘了malloc一個字符串,並將其用作緩衝區。 現在我已經配合它,它不會以分段錯誤告訴我。
再一次,謝謝大家。
使用GDB並在SIGSEGV信號上打印堆棧跟蹤。那麼至少要發帖那這裏所以我們可以多一點幫助。
爲您提供編譯:
$ gcc -g prog.c -o prog
然後GDB下運行它:
$ gdb ./prog
gdb> r
當你SIGSEGV
信號(段錯誤),這樣做:
gdb> bt
然後查看堆棧跟蹤上的內容以查看導致分段故障的原因。
猜測:您可能意外地破壞了主棧中的堆棧,因此丟失了返回地址。你有一個字符串緩衝區,你可能會超出?
如果沒有,你應該嘗試:
如果您的發行版包含它們,可能會有助於安裝glibc-debug軟件包,因爲您將在此時使用glibc代碼。
如果在main()返回後出現段錯誤,通常意味着全局定義的事情出錯了。這麼少的信息很難幫助你。向我們發送更多信息!
MY2C
如果它的後main()
回報,然後根據標準,所有的析構函數都運行(雖然我不會把它過去的執行捏造一些這方面的),除非函數atexit()
已被使用。該函數註冊一個函數,該函數將在main()
返回後有效地被調用(如果我正在閱讀3.6.3)。如果只是爲了完整性,您可以檢查程序中是否有atexit
。
根據「主返回後」的含義,當程序崩潰時,可能正在運行靜態對象的析構函數。檢查這些。 (另外,發佈你觀察到的結果讓你認爲它是在main()
之後返回的。你在那裏可能是錯的。)
如果沒有,那麼你在某處調用了未定義的行爲,很可能以某種方式破壞了堆棧。請參閱Rup的答案以獲得建議。
試試這個線程:http://stackoverflow.com/questions/3718998/methodology-for-fixing-segmentation-faults-in-c – CanSpice 2011-01-26 17:41:05