在linux平台下,設置core mp文件來生成的方法自: 1 )如何生成 coremp 文件 登陸 LINUX 伺服器,任意位置鍵入 echo "ulimit -c 1024" >> /etc/profile 退出 LINUX 重新登陸 LINUX 鍵入 ulimit -c 如果顯示 1024 那麼說明 coremp 已經被開啟。...
❷ 如何生成coremp文件
使用C/C++語言開發程序時,當程序crash的時候產生core mp文件對於調試程序是很有幫助的。在Redhat Linux系統中默認是不生成core mp文件的,這是因為在/etc/profile文件中有這樣一行
ulimit -S -c 0 /dev/null 2&1
第一種方法是修改/etc/profile,把ulimit那一行改為
ulimit -S -c unlimited /dev/null 2&1
這樣設置後系統允許所有用戶生成沒有大小限制的core mp文件。這樣做的優點是不需要重起系統,缺點是無法控制只讓某些用戶生成core mp文件。
* soft core 0
如果只想對某些用戶或用戶組打開core mp,可以加入
user soft core 0或@group soft core 0
注意如果通過修改/etc/security/limits.conf文件打開core mp,還需要注釋掉/etc/profile中的ulmit那一行
#ulimit -S -c 0 /dev/null 2&1
這樣修改的優點是可以針對特定用戶或特定組打開core mp文件,缺點是需要重起系統。
最後說一下生成core mp文件的位置,默認位置與可執行程序在同一目錄下,文件名是core.***,其中***是一個數字。core mp文件名的模式保存在/proc/sys/kernel/core_pattern中,預設值是core。通過以下命令可以更改core mp文件的位置(如希望生成到/tmp/cores目錄下)
❸ linux上的core文件,麻煩牛人們幫忙解釋下是什麼原因
關於UNIX/Linux系統來下面產生的core文件,根據我自使用系統的經驗,通常是由於自己在編寫程序的過程中,由於自己的疏忽,使自己編寫的程序產生了數組越界、或者是程序中的指針指向了一塊無效的內存區域,產生的內存溢出錯誤。這一點在C語言編程過程中尤為明顯,即:雖然定義了一個指針變數,但是未對該變數進行初始化、且判斷該指針是否為空指針,而在後面的程序中又使用到了該變數,這時候肯定就會產生內存溢出錯誤。通常產生的提示信息就是:Segmentfault,CoreDumped!此時再一看自己當前工作的目錄下面,就會自動產生出一個文件名為core的文件,通常該文件佔得空間也是比較大的,至少好幾兆位元組。
❹ 如何生成core文件
1、先用#ulimit -a可以查看系統core文件的大小限制(第一行),core文件大小設置為0, 即沒有打開core mp設置;
[cpp] view plain print?
root@XZX:~/cnnic/project/dnsx/dnsX#ulimit-a
corefilesize(blocks,-c)0
datasegsize(kbytes,-d)unlimited
schelingpriority(-e)0
filesize(blocks,-f)unlimited
pendingsignals(-i)46621
maxlockedmemory(kbytes,-l)64
maxmemorysize(kbytes,-m)unlimited
openfiles(-n)1024
pipesize(512bytes,-p)8
POSIXmessagequeues(bytes,-q)819200
real-timepriority(-r)0
stacksize(kbytes,-s)8192
cputime(seconds,-t)unlimited
maxuserprocesses(-u)46621
virtualmemory(kbytes,-v)unlimited
filelocks(-x)unlimited
ulimit -c 0 不產生core文件
ulimit -c 100 設置core文件最大為100k
ulimit -c unlimited 不限制core文件大小
執行#ulimit -c unlimited,然後#ulimit -a查看結果如下(第一行):
[cpp] view plain print?
root@XZX:~/cnnic/project/dnsx/dnsX#ulimit-a
corefilesize(blocks,-c)unlimited
datasegsize(kbytes,-d)unlimited
schelingpriority(-e)0
filesize(blocks,-f)unlimited
pendingsignals(-i)46621
maxlockedmemory(kbytes,-l)64
maxmemorysize(kbytes,-m)unlimited
openfiles(-n)1024
pipesize(512bytes,-p)8
POSIXmessagequeues(bytes,-q)819200
real-timepriority(-r)0
stacksize(kbytes,-s)8192
cputime(seconds,-t)unlimited
maxuserprocesses(-u)46621
virtualmemory(kbytes,-v)unlimited
filelocks(-x)unlimited
例如:
#gdb ./test core.2065
註:Linux下的C程序常常會因為內存訪問錯誤等原因造成segment fault(段錯誤),此時如果系統core mp功能是打開的,那麼將會有內存映像轉儲到硬碟上來,之後可以用gdb對core文件進行分析,還原系統發生段錯誤時刻的堆棧情況。這對於我們發現程序bug很有幫助。
很多系統默認的core文件大小都是0,我們可以通過在shell的啟動腳本/etc/bashrc或者~/.bashrc等地方來加入 ulimit -c 命令來指定core文件大小,從而確保core文件能夠生成。
除此之外,還可以在/proc/sys/kernel/core_pattern里設置core文件的文件名模板,詳情請看core的官方man手冊。
需要說明的是:上述方法只是在當前shell中生效,重啟之後,就不再有效了。永久生效的辦法是如下:
永久生效辦法:
#vi /etc/profile 然後,在profile中添加:
ulimit -c 1073741824
(但是,若將產生的轉儲文件大小大於該數字時,將不會產生轉儲文件)
或者
ulimit -c unlimited
這樣重啟機器後生效了。 或者, 使用source命令使之馬上生效。
#source /etc/profile
三、指定內核轉儲的文件名和目錄
修改完內核轉儲設置後,當程序core mp後發現確實在本地目錄產生了core文件,但是如果程序多次core mp時,core文件會被覆蓋,原因是每次core mp後生成的文件名默認都叫core,接下來就分享下如果想在每次core m時產生的core文件都帶上進程號怎麼操作,或者你想把內核轉儲文件保存到其他目錄怎麼辦?
1、core mp文件名自動加上進程ID
#echo 1 >/proc/sys/kernel/core_uses_pid
最後生成的core mp文件名會加上進程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 mp文件名仍會加上進程ID。
這里%e, %p分別表示:
%c 轉儲文件的大小上限
%e 所mp的文件名
%g 所mp的進程的實際組ID
%h 主機名
%p 所mp的進程PID
%s 導致本次coremp的信號
%t 轉儲時刻(由1970年1月1日起計的秒數)
%u 所mp進程的實際用戶ID
可以使用以下命令,使修改結果馬上生效。
#sysctl –p /etc/sysctl.conf
請在/var目錄下先建立core文件夾,然後執行a.out程序,就會在/var/core/下產生以指定格式命名的內核轉儲文件。查看轉儲文件的情況:
#ls /var/core
core_a.out_2456
❺ 如何使系統可以產生core文件
這個限制是在/etc/profile裡面設置的: ulimit -S -c 0 > /dev/null 2>1 有幾種方法可以讓系統產生core文件。第一個方法是修改/etc/profile裡面的ulimit命令,如下: ulimit -S -c unlimited > /dev/null 2>1 上面的設置允許系統上的所有用戶產生沒有文件大小限制的core文件。 如果只需要對部分用戶或組開放產生core文件的許可權,需要編輯/etc/security/limits.conf文件。例如,所有在"devel"組裡面的用戶可以產生core文件:#@devel soft core 是core文件的最大塊大小。 在/etc/security/limits.conf文件裡面有配置參數的詳細說明。提示,如果想通過limits.conf裡面的設置來控制用戶是否 可以產生core文件,需要把/etc/profile裡面的ulimits設置注釋掉: # No core files by default # ulimit -S -c 0 > /dev/null 2>1 如果應用是通過daemon命令來啟動的,編輯/etc/init.d/functions,注釋掉ulimit的設置或改變這行: ulimit -S -c 0 >/dev/null 2>1 通過上面的設置,應用程序應該可以產生core文件。如果不能產生core文件,請檢查您的應用程序是否擁有正確的uid,在程序執行的時候是否有 使用setuid改變程序的uid。 在紅帽企業Linux 3上面, 可以通過下面的命令允許使用setuid的應用程序產生core文件: echo 1 > /proc/sys/kernel/core_setuid_ok 另外,您也可以在應用程序中添加下面的代碼來實現: prctl(PR_SET_DUMPABLE, 1); 默認情況下,core文件會創建在應用程序的工作目錄下。