Linux 下如何產生core檔案(core dump設定)
今天在Linux下除錯C程式時,出現段錯誤,習慣性的ls下當前目錄,發現沒有生成core檔案。驚訝了一下,怎麼回事?以前都會產生的啊,難不成是程式的問題?後來同事提醒是不是系統沒有開啟生成core dump的設定。
還真是系統設定問題,我的ubuntu14.04是新裝的,之前沒有進行過core dump的相關配置,別急!我們來看看怎麼對linux系統設定當程式出現段錯誤時產生core檔案:
1、先用#ulimit -a可以檢視系統core檔案的大小限制(第一行),core檔案大小設定為0, 即沒有開啟core dump設定;
2、接下來使用#ulimit -c [kbytes]可以設定系統允許生成的core檔案大小; ulimit -c 0 不產生core檔案 ulimit -c 100 設定core檔案最大為100k ulimit -c unlimited 不限制core檔案大小[email protected]:~/cnnic/project/dnsx/dnsX# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 46621 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 46621 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
執行#ulimit -c unlimited,然後#ulimit -a檢視結果如下(第一行):
此時,core dump設定打開了,再執行程式出現段錯誤時,在當前工作目錄下產生了core檔案,然後我們就可以用gdb除錯core檔案了。[email protected]:~/cnnic/project/dnsx/dnsX# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 46621 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 46621 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
例如:
#gdb ./test core.2065
注:Linux下的C程式常常會因為記憶體訪問錯誤等原因造成segment fault(段錯誤),此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。
很多系統預設的core檔案大小都是0,我們可以通過在shell的啟動指令碼/etc/bashrc或者~/.bashrc等地方來加入 ulimit -c 命令來指定core檔案大小,從而確保core檔案能夠生成。需要說明的是:上述方法只是在當前shell中生效,重啟之後,就不再有效了。永久生效的辦法是如下:
永久生效辦法:
#vi /etc/profile 然後,在profile中新增:
ulimit -c 1073741824
(但是,若將產生的轉儲檔案大小大於該數字時,將不會產生轉儲檔案)
或者
ulimit -c unlimited
這樣重啟機器後生效了。 或者, 使用source命令使之馬上生效。
#source /etc/profile
三、指定核心轉儲的檔名和目錄
修改完核心轉儲設定後,當程式core dump後發現確實在本地目錄產生了core檔案,但是如果程式多次core dump時,core檔案會被覆蓋,原因是每次core dump後生成的檔名預設都叫core,接下來就分享下如果想在每次core dum時產生的core檔案都帶上程序號怎麼操作,或者你想把核心轉儲檔案儲存到其他目錄怎麼辦?
1、core dump檔名自動加上程序ID
#echo 1 > /proc/sys/kernel/core_uses_pid
最後生成的core dump檔名會加上程序ID.
2、另外可以通過修改kernel的引數,指定核心轉儲所生成的core檔案的路徑和檔名。
可以通過在/etc/sysctl.conf檔案中,對sysctl變數kernel.core_pattern的設定。
#vim /etc/sysctl.conf 然後,在sysctl.conf檔案中新增下面兩句話:
kernel.core_pattern = /var/core/core_%e_%p
kernel.core_uses_pid = 0
儲存後退出。
注:如果/proc/sys/kernel/core_uses_pid 這個檔案的內容被配置成1,即使core_pattern中沒有設定%p,最後生成的core dump檔名仍會加上程序ID。
這裡%e, %p分別表示:
%c 轉儲檔案的大小上限
%e 所dump的檔名
%g 所dump的程序的實際組ID
%h 主機名
%p 所dump的程序PID
%s 導致本次coredump的訊號
%t 轉儲時刻(由1970年1月1日起計的秒數)
%u 所dump程序的實際使用者ID
可以使用以下命令,使修改結果馬上生效。
#sysctl –p /etc/sysctl.conf
請在/var目錄下先建立core資料夾,然後執行a.out程式,就會在/var/core/下產生以指定格式命名的核心轉儲檔案。檢視轉儲檔案的情況:
#ls /var/core
core_a.out_2456
相關推薦
Linux 下如何產生core檔案(core dump設定)
今天在Linux下除錯C程式時,出現段錯誤,習慣性的ls下當前目錄,發現沒有生成core檔案。驚訝了一下,怎麼回事?以前都會產生的啊,難不成是程式的問題?後來同事提醒是不是系統沒有開啟生成core dump的設定。 還真是系統設定問題,我的ubuntu14.0
[轉]【已解決】Linux下出現Segmentation Fault(core dump)錯誤
最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的
【已解決】Linux下出現Segmentation Fault(core dump)錯誤
今天被這個問題搞了半個小時,後來通過新增printf(...)語句的方法找到了錯誤原因,是因為在程式中錯誤的輸出一個為空的字串導致。。。 1. 段錯誤是什麼 一句話來說,段錯誤是指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪
linux下Nginx配置檔案(nginx.conf)配置設定詳解(windows用phpstudy整合)
linux備份nginx.conf檔案舉例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在程序列表裡 面找master程序,它的編號就是主程序號。 ps -ef | g
linux下ls -l命令(即ll命令)檢視檔案的顯示結果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令檢視檔案及目錄詳情時,shell中會顯示出好幾列的資訊。平時也沒怎麼注意過,今天忽然心血來潮想了解一下,於是整理了這篇部落格,以供參考: 首先給出一張典型的顯示結果: 下面對其中的每一列
linux下重啟weblogic(關閉和啟動)
遠程文件 hup acl middle 16px target html sin 服務器 本文轉自:http://blog.sina.com.cn/s/blog_4b5bc011010110nq.html ssh遠程連接Linux服務器! 開啟weblogic:
linux下安裝配置jdk(解壓版)
生效 測試 linu 文件 info img url www 技術 在linux下登錄oracle官網,下載解壓版jdk 傳送門 系統默認下載到“下載”目錄中 創建要將該文件解壓的文件夾: 其中 -p 參數代表遞歸創建文件夾(可以創建多級目錄) 進
Linux下配置Django_Apache_Mysql環境(CentOS 7.5)
insert 編輯 warn 連接 dirname 一個數 pla virt rom 本文將介紹如何在Linux上部署Django + Mysql + Apache環境。我們知道,Django內置的http服務器只能工作在單線程下,做開發和調試時候是可以的,但是生產環
【轉載】linux下安裝wget命令(sftp實現法)
如何安裝wget命令。 方法一:通過yum 命令列為:yum install wget 完成。此操作很簡單,但是我安裝的linux是centos的最小版本,執行上述命令時會出現無法連線到源網站(大概是這個意思)的問題。 方法二:通過rpm 據說rpm是linux的通用安裝法,小白表示不懂
linux下目錄、檔案顯示顏色的設定生效
Centos系統 拷貝/etc/DIR_COLORS檔案為當前主目錄的 .dir_colors 命令:cp /etc/DIR_COLORS ~/.dir_colors 修改~/.dir_colors中DIR對應的顏色vim ~/.dir_colors 找到下面這一行: &nb
Linux下使用Docker教程(詳細圖解演示)
一:環境配置.(這裡使用Yum安裝,也可以Rpm和Shell安裝) 1.1 Docker執行在CentOS7.X之上的要求是核心的版本要求在3.10之上的.我這裡安裝了CentOS7的. &
linux之間互傳檔案(ubuntu為例)
1.sudo apt-get update 下載前更新一下源,防止有些包找不到 2.sudo apt-get install openssh-server 下載ssh的服務端,其實執行這個命令之後,openssh-client也會預設安裝,反正我的是這樣。如果沒有預設安裝c
Linux 下閱讀原始碼工具(Vim + ctags+Cscope)
0. 寫在前面的廢話 開發環境遷移到了Ubuntu下,所有windows下好用的工具都要找個替代品。 windows下一直用 souce Insight 來閱讀原始碼,需要在Ubuntu下找個替代品。 上網看了看,貌似Vim + Ctags + Cscope不錯,安
Linux下C語言開發(開篇hello world.)
從大學選擇走嵌入式方向到現在從事嵌入式驅動工程師職位已一年多了,要能勝任嵌入式驅動工程師(當然,這裡我所說的嵌入式驅動工程師並非指驅動開發,往往只需要根據自己的系統移植驅動以及編寫簡單的驅動)確實需要不少知識,如:開發環境搭建、看懂簡單硬體電路原理圖、瞭解常用硬體工作原理、
linux下產生core檔案以及不產生core檔案的條件
Linux下,產生core檔案,和不產生core檔案的條件: 當我們的程式崩潰時,核心有可能把該程式當前記憶體對映到core檔案裡,方便程式設計師找到程式出現問題的地方。最常出現的,幾乎所有C程式設計師都出現過的錯誤就是“段錯誤”了。也是最難查出問題原因的一個錯誤。下面我們就針對“段錯誤”來分析co
linux下的core檔案路徑及檔名設定
方式一、臨時設定 1 、如何生成 coredump 檔案 ? 1)使用ulimit -c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,不會生成core檔案。 2)使用ulimit -c filesize命令,可以限制core檔案的大小(fil
Linux下自動化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)
1、先配置好Docker阿里雲加速,可以使用阿里雲容器服務 (可自己在阿里雲申請,要不然安裝東西直接很慢)注意:https://XXXX.mirror.aliyuncs.com為阿里雲加速服務分配地址 sudo mkdir -p /etc/docker sudo tee /etc/docker/dae
LINUX 下Jexus部署ASP.NET Core WebApi
usr netcore stat /tmp tools onf 節點 提示符 微軟 服務器:LINUX ubuntu16.04 開發軟件:VS2015 Update3 dotnet sdk: DotNetCore.1.0.0-VS2015Tools.Previe
Linux下卸載刪除.Net Core
net div yum 遇到 安裝 rem dev 小夥伴 交流群 最近在技術博客和技術交流群遇到很多小夥伴們在Linux下更新或者安裝.Net Core SDK後dotnet命令無法識別等問題,現如下解決: 卸載SDK命令 sudo yum remove dotnet-
Linux下的段錯誤(Segmentation fault)產生的原因及除錯方法
段錯誤 就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址. 一 般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gdtr來儲存的是一個48位的暫存器, 前32位是儲存由它指