2011-01-26 53 views
3

我在Linux上有一個很長的程序,在主返回後給我分段錯誤。 它是一個很長的程序,所以我不能發佈它。那麼你能幫我什麼可以做出這樣的錯誤?主要返回後的分段錯誤

謝謝。

哇,這些答案真的很快。謝謝你們。 我想我解決了它,我忘了malloc一個字符串,並將其用作緩衝區。 現在我已經配合它,它不會以分段錯誤告訴我。

再一次,謝謝大家。

+0

試試這個線程:http://stackoverflow.com/questions/3718998/methodology-for-fixing-segmentation-faults-in-c – CanSpice 2011-01-26 17:41:05

回答

1

使用GDB並在SIGSEGV信號上打印堆棧跟蹤。那麼至少要發帖這裏所以我們可以多一點幫助。

爲您提供編譯:

$ gcc -g prog.c -o prog 

然後GDB下運行它:

$ gdb ./prog 
gdb> r 

當你SIGSEGV信號(段錯誤),這樣做:

gdb> bt 

然後查看堆棧跟蹤上的內容以查看導致分段故障的原因。

3

猜測:您可能意外地破壞了主棧中的堆棧,因此丟失了返回地址。你有一個字符串緩衝區,你可能會超出?

如果沒有,你應該嘗試:

  • 下運行的valgrind
  • 程序用gdb調試程序趕上大跌,看看你在這一點上;您也可以調試轉儲的核心文件

如果您的發行版包含它們,可能會有助於安裝glibc-debug軟件包,因爲您將在此時使用glibc代碼。

1

如果在main()返回後出現段錯誤,通常意味着全局定義的事情出錯了。這麼少的信息很難幫助你。向我們發送更多信息!

MY2C

1

如果它的後main()回報,然後根據標準,所有的析構函數都運行(雖然我不會把它過去的執行捏造一些這方面的),除非函數atexit()已被使用。該函數註冊一個函數,該函數將在main()返回後有效地被調用(如果我正在閱讀3.6.3)。如果只是爲了完整性,您可以檢查程序中是否有atexit

根據「主返回後」的含義,當程序崩潰時,可能正在運行靜態對象的析構函數。檢查這些。 (另外,發佈你觀察到的結果讓你認爲它是在main()之後返回的。你在那裏可能是錯的。)

如果沒有,那麼你在某處調用了未定義的行爲,很可能以某種方式破壞了堆棧。請參閱Rup的答案以獲得建議。