在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文件会创建在应用程序的工作目录下。