core文件的產生與調試

在linux系統下運行程序,假如程序崩潰,則當前目錄下將出現一個名爲core...的文件,記錄崩潰的相關信息。

目錄

core的產生標誌

編譯

core文件的命名

調試


core的產生標誌

在命令行輸入ulimit -a,假如打印的結果第一行(core file size) 返回值爲0,則core文件不會生成。此時,程序員可以輸入:

ulimit -c 1024

 撰稿時,我注意到,當自己以sudo權限操作時,ulimt -c 指令可能失靈。解決辦法是關掉當前命令行,重新開一個。

編譯

在前一篇博客《首次gdb調試》中,我們看到產生的可執行文件編譯時要有-g標誌,否則bt命令難以回溯到具體的崩潰位置。同樣,假如編譯可執行文件時沒有-g標誌,core文件中也不能獲取崩潰的具體信息。

g++ main.cpp -g -o main.out

core文件的命名

default情況下,core文件的名字就是core。但是如果程序中跑了多個進程,則程序員肯定希望每個進程都有自己的core文件,且能通過pid號來區分各個文件。此時,程序員可以通過如下命令,將每個進程的core文件後面加上進程pid來區別:

echo "1" > /proc/sys/kernel/core_uses_pid 

假如界面反饋權限不夠,則採用nano來編輯該文件:

sudo nano /proc/sys/kernel/core_uses_pid 

調試

按照下圖輸入指令,完成編譯。然後運行可執行文件,返回“段錯誤”。

運行後,執行ls命令,你將看到core.XXXX文件,其中XXXX是進程號。

執行如下命令,追蹤到具體的崩潰位置(下圖紅線指示了各步操作):

gdb  ./main.out
core-file core.XXXX
bt

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章