
1、先用#ulimit -a可以查看系统core文件的大小限制(第一行),core文件大小设置为0, 即没有打开core dump设置;
[cpp] view plain copy print?
root@XZX:~/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
root@XZX:~/cnnic/project/dnsx/dnsX# ulimit -acore 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
2、接下来使用#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 copy print?
root@XZX:~/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
root@XZX:~/cnnic/project/dnsx/dnsX# ulimit -acore 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
此时,core dump设置打开了,再执行程序出现段错误时,在当前工作目录下产生了core文件,然后我们就可以用gdb调试core文件了。
例如:
#gdb ./test core.2065
注:Linux下的C程序常常会因为内存访问错误等原因造成segment fault(段错误),此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用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 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
一、要保证存放Core dump的目录存在且进程对该目录有写权限。存放Core dump的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看"/proc/<进程pid>/cwd"符号链接的目标来确定进程真正的当前目录地址。通过系统服务启动的进程也可通过这一方法查看。
二、若程序调用了seteuid()/setegid()改变了进程的有效用户或组,则在默认情况下系统不会为这些进程生成Core dump。很多服务程序都会调用seteuid(),如MySQL,不论你用什么用户运行mysqld_safe启动MySQL,mysqld进行的有效用户始终是msyql用户。如果你当初是以用户A运行了某个程序,但在ps里看到的这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成Coredump,需要(echo "1" >/proc/sys/kernel/suid_dumpable)。
三、这个一般都知道,就是要设置足够大的Core文件大小限制了。程序崩溃时生成的Core文件大小即为程序运行时占用的内存大小。但程序崩溃时的行为不可按平常时的行为来估计,比如缓冲区溢出等错误可能导致堆栈被破坏,因此经常会出现某个变量的值被修改成乱七八糟的,然后程序用这个大小去申请内存就可能导致程序比平常时多占用很多内存。因此无论程序正常运行时占用的内存多么少,要保证生成Core文件还是将大小限制设为unlimited为好。
4
四、在/etc/profile中添加:ulimit -c unlimited >/dev/null 2?&1
五、一般在 CLI 上启动的程序,如果设置:ulimit -c unlimited
就可以在程序以外终止时生成 core dump 文件。但是对于 daemon 方式运行的程序,其与 CLI 启动的程序的主要区别是进程的运行环境,其中就包括
cwd(current working directory)。如果以相对路径方式定义 core 文件的格式,比如定义 /proc/sys/kernel/core_pattern 为:
core-%e-%p-%t
则一般来说,daemon 文件的 cwd 就是/,你可以通过/proc/<your_program_pid>/cwd来查看,一般都是连接到/目录。而如果用户对这个目录没有写权限,那么就不会生成 core dump 文件了。
最直接的解决的方法,是修改/proc/sys/kernel/core_pattern为绝对路径:/data/coredump/core-%e-%p-%t
并且保证这样就基本 OK 了。
修改/proc/sys/kernel/core_pattern文件中的 core dump 文件格式为绝对路径,比如:
/data/coredump/core-%e-%p-%t
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)