Linux 设置core dump
原文地址:http://blog.csdn.net/u013010310/article/details/50578691
最近本人負責項目中的流媒體轉發模塊,查了很多資料后選擇了EasyDarwin作為轉發服務器。編譯源碼之后服務器穩定運行了半個月,但是今天突然不能正常轉發了。由于本人Linux新手,所以沒有在Linux下調試代碼的經驗,在群主的指導下知道可以設置core文件來調試代碼,于是幾經周折完成了core文件的設置,特將過程記錄下來。
什么是coredump
當程序運行的過程中異常終止或崩潰,操作系統會將程序當時的內存狀態記錄下來,保存在一個文件中,這種行為就叫做Core Dump(中文有的翻譯成“核心轉儲”)。我們可以認為 core dump 是“內存快照”,但實際上,除了內存信息之外,還有些關鍵的程序運行狀態也會同時 dump 下來,例如寄存器信息(包括程序指針、棧指針等)、內存管理信息、其他處理器和操作系統狀態和信息。core dump 對于編程人員診斷和調試程序是非常有幫助的,因為對于有些程序錯誤是很難重現的,例如指針異常,而 core dump 文件可以再現程序出錯時的情景。
Linux下打開coredump
本人使用的Linux發行版是Ubantu 14.04,設置生成coredump文件的方法如下:
- 打開core dump功能
在終端中輸入命令ulimit -c(也可以通過ulimit -a查看) 輸出的結果為 0,說明默認是關閉 core dump 的,即當程序異常終止時,也不會生成 core dump 文件。
我們可以使用命令 ulimit -c unlimited 來開啟 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,將 unlimited 改成你想生成 core 文件最大的大小,注意單位為 blocks(KB)。
用上面命令只會對當前的終端環境有效,如果想需要永久生效,可以修改文件/etc/bash.bashrc文件,添加一行ulimit -c unlimited,然后執行命令source /etc/bash.bashrc生效。此時通過ulimit -a查看:
(有網友的資料是直接修改/etc/security/limits.conf文件,但是我測試了沒有效果。) -
設置core文件保存路徑
默認生成的 core 文件保存在可執行文件所在的目錄下,文件名就為 core,修改此文件名方法有兩種:
1、通過修改/proc/sys/kernel/core_uses_pid文件可以讓生成 core 文件名是否自動加上 pid 號。命令如下:echo 1 > /proc/sys/kernel/core_uses_pid生成的 core 文件名將會變成 core.pid,其中 pid 表示該進程的 PID。2、還可以通過修改/proc/sys/kernel/core_pattern 來控制生成 core 文件保存的位置以及文件名格式。命令可以用echo "/EasyDarwin/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 設置生成的 core 文件保存在/EasyDarwin/ 目錄下,文件名格式為 “core-命令名-pid-時間戳”。其中:
其中:- %c 轉儲文件的大小上限
- %e 所dump的文件名
- %g 所dump的進程的實際組ID
- %h 主機名
- %p 所dump的進程PID
- %s 導致本次coredump的信號
- %t 轉儲時刻(由1970年1月1日起計的秒數)
- %u 所dump進程的實際用戶ID
gdb調試core文件
產生了 core 文件,我們該如何使用該 Core 文件進行調試呢?Linux 中可以使用 GDB 來調試 core 文件,步驟如下:
- 首先,寫段錯誤代碼,這個對程序猿來說很簡單,使用 gcc 編譯源文件,加上 -g 以增加調試信息;
編譯:
gcc -g -o test test.c- 運行程序,以使程序異常終止時能生成 core 文件;
- 當core dump 之后,使用命令 gdb program core 來查看 core 文件,其中 program為可執行程序名,core 為生成的 core 文件名。
可以看到gdb直接定位到了程序中出錯的具體行。至于具體gdb的使用方法本人也還在摸索之中。需要說明的是,要是EasyDarwin能在錯誤時產生core文件,需要使用./Built debug命令來編譯源程序。最后感謝EasyDarwin群主的熱心幫助。
總結
以上是生活随笔為你收集整理的Linux 设置core dump的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下使用expect+scp+s
- 下一篇: linux文件目录分析之/etc目录