開發和使用Unix程序時,有時程序莫名其妙的down了,卻沒有任何的提示(有時內候會提示coremped).這時候可以查看一下有沒有容形如core.進程號的文件生成,這個文件便是操作系統把程序down掉時的內存內容扔出來生成的,它可以做為調試程序的參考.coremp又叫核心轉儲,當程序運行過程中發生異常,程序異常退出時,由操作系統把程序當前的內存狀況存儲在一個core文件中,叫coremp.gdb-ccore文件路徑[應用程序的路徑]進去後輸入where回車,就可以顯示程序在哪一行當掉的,在哪個函數中.有時候程序down了,但是core文件卻沒有生成.core文件的生成跟你當前系統的環境設置有關系,可以用下面的語句設置一下,然後再運行程序便成生成core文件.core文件生成的位置一般於運行程序的路徑相同,文件名一般為core.進程號
⑵ 鎬庝箞璁劇疆core鏂囦歡鐨勪駭鐢熺洰褰
涓鍏卞洓涓鐩褰曪紝璁劇疆渚濇″備笅錛
1銆佸伐浣滅洰褰曪細錛堣繖涓鏄璁劇疆浣犵殑宸ヤ綔鏂囦歡鏀懼湪閭d釜鏂囦歡澶圭殑璺寰勶紝姣斿備綘宸ヤ綔璺寰勬槸D鐩/鏂板緩鏂囦歡澶癸紝閭d箞浣犵洿鎺ヨ劇疆鍒拌繖閲屽氨琛屼簡錛
2銆佺煝閲忓瓧搴撶洰褰曪細榪欎釜涓鑸閮芥槸緋葷粺榛樿ょ殑錛屼竴鑸涓嶉渶瑕佽劇疆銆備竴鑸閮芥槸璁劇疆鍦–:\MAPGIS67\CLIB
3銆佺郴緇熷簱鐩褰曪細榪欎釜涓鑸閮芥槸緋葷粺榛樿ょ殑錛屼竴鑸涓嶉渶瑕佽劇疆銆備竴鑸閮芥槸璁劇疆鍦–:\MAPGIS67\SLIB
4銆佺郴緇熶復鏃剁洰褰曪細榪欎釜涓鑸閮芥槸緋葷粺榛樿ょ殑錛屼竴鑸涓嶉渶瑕佽劇疆銆備竴鑸閮芥槸璁劇疆鍦–:\MAPGIS67\TEMP
浠ヤ笂錛屽笇鏈涢噰綰
⑶ 如何產生javacore文件和heapmp文件
JavaCore/HeapDump這兩個文件可以用手工的方式生成,當我們會遇到系統變慢或無響應的情況,這時就以採用手工的方式生成JavaCore及HeapDump文件。
在Unix/Linux上,產生這兩個文件的方法如下:
# ps -ef | grep java
user 4616 4582 0 17:30 pts/0 00:00:00 grep java
root 5580 1 0 Oct27 ? 00:02:27 /usr/bin/java -server -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat8090/conf/logging.properties -Djava.endorsed.dirs=/usr/local/tomcat8090/endorsed -classpath:/usr/local/tomcat8090/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat8090 -Dcatalina.home=/usr/local/tomcat8090 -Djava.io.tmpdir=/usr/local/tomcat8090/temp org.apache.catalina.startup.Bootstrap start
# kill -3 5580
首先,找出Java進程id ,然後再執行『kill -3 進程號』的操作,等文件生成後再做一次同樣的操作,再產生一組文件。
⑷ 怎麼設置core文件的產生目錄
一共四個目錄,設置依次如下:
1、工作目錄:(這個是設置你的工作文件放在那個文件夾的路回徑,答比如你工作路徑是D盤/新建文件夾,那麼你直接設置到這里就行了)
2、矢量字型檔目錄:這個一般都是系統默認的,一般不需要設置。一般都是設置在C:\MAPGIS67\CLIB
3、系統庫目錄:這個一般都是系統默認的,一般不需要設置。一般都是設置在C:\MAPGIS67\SLIB
4、系統臨時目錄:這個一般都是系統默認的,一般不需要設置。一般都是設置在C:\MAPGIS67\TEMP。
⑸ 如何生成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