在寫 linux 程式時,經常會遇到「段錯誤」(segmentation fault) 這樣的問題。如果程式比較大,那麼如果用 gdb 除錯可能顯得比較吃力。這時可以用 core dump 檔案來進行分析。
那什麼是 core dump 檔案呢?
core dump 檔案就是在程式發生錯誤時,由作業系統把程式錯誤時的相應內容 dump 出來,然後儲存在乙個檔案中,這個檔案就是當時的記憶體映像,也就是 core dump 檔案。
造成「段錯誤」產生的原因經常是因為指標的亂用。比如下面這個測試程式:
#include
int main()
在上面的程式中,hello world 字串在編譯時就會被分配到 .rodata 區域,相當於屬於 const 型別,是不能進行修改的。然後在程式裡,卻用指標進行了更改,那麼這個程式在執行起來,就會產生段錯誤:
segmentation fault (core dumped)
一般的,系統預設是不會產生core dump檔案的,而上面,在括號裡提示 core dumped ,則表示已經產生了 core dumped 檔案。使能產生 core dumped 檔案的方法是:
ulimit -s -c unlimited > /dev/null 2>&1
使用 gdb 與 core dumped 來定位錯誤
當執行程式出錯後,會產生 core dumped 檔案,此時可用 gdb 和 core dumped 配合來定位程式的錯誤,使用方法是:
gdb 可執行檔案 core_dumped檔案
可以在與程式同乙個目錄下觀察到生成的 core dumped 檔案:core.22421。這裡 core.22421中的 22421是當時程式執行的 pid 值。
能夠產生 core 檔案的訊號
當程式接收到以下訊號時會產生 core 檔案:
sigabrt :異常終止(abort)時發出的訊號
說明:呼叫abort函式時產生此訊號。程序異常終止。
sigbus :硬體發生故障時發出的訊號
說明:指示乙個實現定義的硬體故障。
sigfpe :算術異常時發出的訊號
說明:此訊號表示乙個算術運算異常,例如除以0,浮點溢位等。
sigill :遇到非法硬體指令時發出的訊號
說明:此訊號指示程序已執行一條非法硬體指令。4.3bsd由abort函式產生此訊號。現在 abort() 函式用來生成 sigabrt 訊號。
sigiot :硬體故障時發出的訊號
說明:iot這個名字來自於pdp-11對於 輸入/輸出 trap(input/output trap)指令的縮寫。系統v的早期版本,由abort函式產生此訊號。sigabrt現在被用於此。
sigquit :終端退出時發出的訊號
說明:當使用者在終端上按退出鍵(一般採用ctrl-\)時,產生此訊號,並送至前台程序組中的所有程序。此訊號不僅終止前台程序組(如sigint所做的那樣),同時產生乙個core檔案。
sigsegv :無效儲存訪問發出的訊號
說明:程序進行了一次無效的儲存訪問。字segv表示「段違例(segmentation violation)」。
sigsys :無效的系統呼叫時發出的訊號
說明:進行了乙個無效的系統呼叫。由於某種未知原因,程序執行了一條系統呼叫指令,但其指示系統呼叫型別的引數卻是無效的。
sigtrap :硬體故障時發出的訊號
說明:此訊號名來自於 pdp-11 的trap指令。
sigxcpu :超過cpu限制(setrlimit)時發出的訊號
說明:svr4 和 4.3+bsd 支援資源限制的概念。如果程序超過了其軟 cpu 時間限制,則產生此訊號。xcpu 是 "exceeded cpu time「 的縮寫。
sigxfsz :超過檔案長度限制(setrlimit)時發出的訊號
說明:如果程序超過了其軟檔案長度限制時發出此訊號。
更多:
檢查core dump檔案
對應的英文引自 5.1 檢查core檔案 核心轉儲檔案 除了允許程式在偵錯程式的控制下執行外,g選項乙個非常有用的功能是利用 core dump 檢查程式崩潰的原因。當乙個程式異常結束時 比如崩潰 作業系統能夠將程式崩潰時記憶體中的狀態資訊寫入乙個core檔案 通常這個檔案命名為core 這個檔案經...
GDB除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...
gdb除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...