文件管理 · 2024年9月23日

core文件生成路径|请教如何查看core文件是哪个程序产生的

⑴ 请教如何查看core文件是哪个程序产生的

开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时内候会提示coremped).这时候可以查看一下有没有容形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.coremp又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫coremp.gdb-ccore文件路径[应用程序的路径]进去后输入where回车,就可以显示程序在哪一行当掉的,在哪个函数中.有时候程序down了,但是core文件却没有生成.core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置一下,然后再运行程序便成生成core文件.core文件生成的位置一般于运行程序的路径相同,文件名一般为core.进程号

⑵ 鎬庝箞璁剧疆core鏂囦欢鐨勪骇鐢熺洰褰

涓鍏卞洓涓鐩褰曪紝璁剧疆渚濇″備笅锛1銆佸伐浣滅洰褰曪細锛堣繖涓鏄璁剧疆浣犵殑宸ヤ綔鏂囦欢鏀惧湪閭d釜鏂囦欢澶圭殑璺寰勶紝姣斿備綘宸ヤ綔璺寰勬槸D鐩/鏂板缓鏂囦欢澶癸紝閭d箞浣犵洿鎺ヨ剧疆鍒拌繖閲屽氨琛屼簡锛2銆佺煝閲忓瓧搴撶洰褰曪細杩欎釜涓鑸閮芥槸绯荤粺榛樿ょ殑锛屼竴鑸涓嶉渶瑕佽剧疆銆備竴鑸閮芥槸璁剧疆鍦–:\MAPGIS67\CLIB3銆佺郴缁熷簱鐩褰曪細杩欎釜涓鑸閮芥槸绯荤粺榛樿ょ殑锛屼竴鑸涓嶉渶瑕佽剧疆銆備竴鑸閮芥槸璁剧疆鍦–:\MAPGIS67\SLIB4銆佺郴缁熶复鏃剁洰褰曪細杩欎釜涓鑸閮芥槸绯荤粺榛樿ょ殑锛屼竴鑸涓嶉渶瑕佽剧疆銆備竴鑸閮芥槸璁剧疆鍦–:\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 javaroot 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\CLIB3、系统库目录:这个一般都是系统默认的,一般不需要设置。一般都是设置在C:\MAPGIS67\SLIB4、系统临时目录:这个一般都是系统默认的,一般不需要设置。一般都是设置在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

root@XZX:~/cnnic/project/dnsx/dnsX# ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 46621max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 46621virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited2、接下来使用#ulimit -c [kbytes]可以设置系统允许生成的core文件大小;

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

root@XZX:~/cnnic/project/dnsx/dnsX# ulimit -acore file size (blocks, -c) unlimiteddata seg size (kbytes, -d) unlimitedscheling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 46621max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 46621virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited此时,core mp设置打开了,再执行程序出现段错误时,在当前工作目录下产生了core文件,然后我们就可以用gdb调试core文件了。

例如:

#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