在linux系統下運行程序,假如程序崩潰,則當前目錄下將出現一個名爲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