NoiLinux中編寫cpp程式出現段錯誤的解決方案分析
NOIP資訊學奧賽複賽中全員需要使用noilinux來編寫程式,大佬們教我們用vim,然後vim編寫程式時不能逐步除錯,只能斷言輸出(可能是井底之蛙沒發現),而且在出現段錯誤的時候,只會華麗麗的出來如下類似語句:
/bin/bash:行 1 :2863 段錯誤 ./mst
shell 已返回 139
請按ENTER 或其它命令繼續
然後大家就各種抓狂,清醒的呢還知道一步步去斷言輸出看程式走到哪出現的段錯誤,不清醒的只能盲目肉眼查錯加心慌意亂。
段錯誤是指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪問了系統保護的記憶體地址、訪問了只讀的記憶體地址等等情況。
在C++程式中,段錯誤一般來說由以下幾種情況產生(有不足留言指出):
1.陣列開爆,陣列下表越界。
2.指標指向了未知的記憶體空間。
3.爆棧,函式遞迴呼叫時空間消耗過多。
4.除數為零。
……
好了下面來說說出現段錯誤的一種解決辦法:使用gdb。使用步驟是:
1.將.cpp檔案用編譯軟體編譯生成可執行檔案,如假設cpp檔名為mst.cpp,則用vim編譯後會生成mst的可執行檔案。
2.使用gdb命令除錯程式
gdb ./mst
[email protected]:~stuTest/$ gdb ./mst
GNU.gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2)7.7.1
Copyright (c)。。。。
。。。。。
Reading symbols from ./mst...(no debugging symbols found) ...done
3.進入gdb後輸入run執行程式 (gdb) run 就會出現如下類似語句:
Starting program: /home/noilinux/stuTest/mst Program received signal SIGSEGV, Segmentation fault. 0x0804868a in find (int) ( ) (gdb)
從輸出看出,程式mst收到SIGSEGV訊號,觸發段錯誤,並提示地址0x0804868a、呼叫find函式報錯。立即將段錯誤定位到find函式內部查錯。 4.找到段錯誤產生的地點後,輸入 quit 命令退出gdb:
(gdb) quit
A debugging session is active.
Inferior 1 [process 3046] will be killed.
Quit anyway? (y or n) y
以上便是我所理解的一種關於段錯誤的解決方法,更多關於段錯誤的解決方法,可以詳見我用來學習參考的部落格http://makaidong.com/liangzhao_jay/1/8452_11287162.html進行學習。