Linux 系统设置 ulimit 以及 Core文件的生成

查看限制情况 ulimit -a

可以看到如下信息

core file size           (blocks, -c) 0
data seg size            (kbytes, -d) unlimited
file size                (blocks, -f) unlimited
pending signals                  (-i) 1024
max locked memory        (kbytes, -l) 32
max memory size          (kbytes, -m) unlimited
open files                       (-n) 1024
pipe size             (512 bytes, -p) 8
POSIX message queues      (bytes, -q) 819200
stack size               (kbytes, -s) 10240
cpu time                (seconds, -t) unlimited
max user processes               (-u) 4096
virtual memory           (kbytes, -v) unlimited
file locks                       (-x) unlimited

-----------------------------------------------------------------------------------

功能说明:控制shell程序的资源。

语  法:ulimit [-aHS][-c <core文件上限>][-d
<数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p
<缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v
<虚拟内存大小>]

补充说明:ulimit为shell内建指令,可用来控制shell执行程序的资源。

参  数:
    -a  显示目前资源限制的设定。
    -c <core文件上限>  设定core文件的最大值,单位为区块。
    -d <数据节区大小>  程序数据节区的最大值,单位为KB。
    -f <文件大小>  shell所能建立的最大文件,单位为区块。
    -H  设定资源的硬性限制,也就是管理员所设下的限制。
    -m <内存大小>  指定可使用内存的上限,单位为KB。
    -n <文件数目>  指定同一时间最多可开启的文件数。
    -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
    -s <堆叠大小>  指定堆叠的上限,单位为KB。
    -S  设定资源的弹性限制。
    -t <CPU时间>  指定CPU使用时间的上限,单位为秒。
    -u <程序数目>  用户最多可开启的程序数目。
    -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

------------------

1,说明:
ulimit用于shell启动进程所占用的资源.

2,类别:
shell内建命令

3,语法格式:
ulimit [-acdfHlmnpsStvw] [size]

4,参数介绍:

-H 设置硬件资源限制.
           -S 设置软件资源限制.
           -a 显示当前所有的资源限制.
           -c size:设置core文件的最大值.单位:blocks
           -d size:设置数据段的最大值.单位:kbytes
           -f size:设置创建文件的最大值.单位:blocks
           -l size:设置在内存中锁定进程的最大值.单位:kbytes
           -m size:设置可以使用的常驻内存的最大值.单位:kbytes
           -n size:设置内核可以同时打开的文件描述符的最大值.单位:n
           -p size:设置管道缓冲区的最大值.单位:kbytes
           -s size:设置堆栈的最大值.单位:kbytes
           -t size:设置CPU使用时间的最大上限.单位:seconds
           -v size:设置虚拟内存的最大值.单位:kbytes

5,简单实例:

1]如果我们想要对由shell创建的文件大小作些限制,如:

CODE:

#ll h
           -rw-r--r-- 1 lee lee 150062 7月 22 02:39 h
           #ulimit -f 100 #设置创建文件的最大块(一块=512字节)
           #cat h>newh
           File size limit exceeded
           #ll newh
           -rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh

文件h的大小是150062字节,而我们设定的创建文件的大小是512字节x100块=51200字节
当然系统就会根据你的设置生成了51200字节的newh文件.

3]把你要设置的ulimit放在/etc/profile这个环境文件中.

当系统中的一些程序在遇到一些错误以及crash时,系统会自动产生core文件记录crash时刻系统信息,包括内存和寄存器信息,用以程序员日
后debug时可以使用。这些错误包括段错误、非法指令、总线错误或用户自己生成的退出信息等等,一般地,core文件在当前文件夹中存放。

core文件有时可能在你发生错误时,并没有出现在你当前的文件夹中,发生这种情况的原因有两个:一个是当前终端被设置为不能弹出core文件;另一种则是core文件被指定了路径。

对于前者,我们可以使用ulimit命令对core文件的大小进行设定。一般默认情况下,core文件的大小被设置为0,这样系统就不dump出core文件了。这时,使用命令:ulimit -c unlimited进行设置,就可以把core文件的大小设置为无限大,同时也可以使用数字来替代unlimited,对core文件的上限制做更精确的设定。(此方法暂时生效,退出失效)

除了可以设置core文件的大小之外,还可以对core文件的名称进行一些规定。这种设置是对/proc/sys/kernel/core_pattern和/proc/sys/kernel/core_uses_pid这两个文件进行修改。改动这两个文件的方法如下:

echo <pattern> > /proc/sys/kernel/core_pattern

echo <"0"/"1"> /proc/sys/kernel/core_uses_pid

并且注意,只有超级用户才可以修改这两个表。

core_pattern接受的是core文件名称的pattern,它包含任何字符串,并且用%作为转移符号生成一些标示符,为core文件名称加入特殊含义。已定义的标示符有如下这些:

%%:相当于%

%p:相当于<pid>

%u:相当于<uid>

%g:相当于<gid>

%s:相当于导致dump的信号的数字

%t:相当于dump的时间

%e:相当于执行文件的名称

%h:相当于hostname

除以上这些标志位外,还规定:

1、末尾的单个%可以直接去除;

2、%加上除上述以外的任何字符,%和该字符都会被去除;

3、所有其他字符都作为一般字符加入名称中;

4、core文件的名称最大值为64个字节(包括‘/0‘);

5、core_pattern中默认的pattern为core;

6、为了保持兼容性,通过设置core_uses_pid,可以在core文件的末尾加上%p;

7、pattern中可以包含路径信息

1. 可以用ulimit -a 查看一下栈的大小。

在内核2.6.20下, stack size 为8192 kbytes
如果这里没有限制,就栈的大小就只受内存的限制。2G是上限。

2. core 文件
     * 开启或关闭core文件的生成
ulimit -c 可以查看是否打开此选项,若为0则为关闭;
ulimit -c 0可手动关闭
ulimit -c 1000 为设置core文件大小最大为1000k

ulimit -c unlimited 设置core文件大小为不限制大小

很多系统在默认的情况下是关闭生成core文件的,这个命令可以加到你的profile中去

3.设置Core Dump的核心转储文件目录和命名规则

在默认的情况下,很多系统的core文件是生成在你运行程序的目录下,或者你在程序中chdir后的那个目录,然后在core文件的后面加了一个
pid。在实际工作中,这样可能会造成很多目录下产生core文件,不便于管理,实际上,在2.6下,core文件的生成位置和文件名的命名都是可以配置
的。

/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
可以这样修改:
echo "/tmp/core-%e-%p" > core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
     %p - insert pid into filename 添加pid
     %u - insert current uid into filename 添加当前uid
     %g - insert current gid into filename 添加当前gid
     %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
     %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
     %h - insert hostname where the coredump happened into filename 添加主机名
     %e - insert coredumping executable name into filename 添加命令名

当然,你可以用下列方式来完成
sysctl -w kernel.core_pattern=/tmp/core-%e-%p

这些操作一旦计算机重启,则会丢失,如果你想持久化这些操作,可以在 /etc/sysctl.conf文件中增加:
kernel.core_pattern=/tmp/core%p

加好后,如果你想不重启看看效果的话,则用下面的命令:
sysctl -p /etc/sysctl.conf

------------------------------------------------------------------------------------------------------------------

高手指教:

解决的问题:
            现有一程序P 长期在服务器上运行,目前经常是每1天死掉一次(段错误)。

目前解决方法:
            用SecureCRT开一个终端,并在服务其上设置ulimit -c nulimited,然后启动程序P。用ulimite -a 命令查询结果如下:

core file size         (blocks, -c) unlimited
            data seg size              (kbytes, -d) unlimited
            file size                 (blocks, -f) unlimited
            pending signals                      (-i) 1024
            max locked memory     (kbytes, -l) 32
             ............
            表明core文件可以生成。

并测试利用kill -6 pid能够core文件。

目前的困难:

当运行ulimit -c nulimited终端 (并且该终端将程序P启动到后台了 ./P &)关闭,程序P死掉后并没有生成 core文件。
            经试验后发现ulimit 命令与终端有关。

高手指教:
             如何设置能够生成core 文件,与终端无关
             即,程序启动,关闭终端,当程序死掉(段错误)后能够生成core文件。


/etc/security/limits.conf (中设置 redhat衍生系Linux

/etc/profile中的:
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

注释掉上面一行。

还有其他UNIX类操作系统也有自己的配置文件可以设置。

------------------------------------------------------------------------------------------------------------------

gdb core 多线程
           多线程如果dump,多为段错误,一般都涉及内存非法读写。可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成core文件。    
           ulimit -c unlimited
           这样的话死掉的时候就可以在当前目录看到core.pid(pid为进程号)的文件。接着使用gdb:
           gdb ./bin ./core.pid
           进去后,使用bt查看死掉时栈的情况,在使用frame命令。
           
           还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:
           gcore pid
(调试进程的pid号)
           手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在
if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。

时间: 2024-11-03 12:33:35

Linux 系统设置 ulimit 以及 Core文件的生成的相关文章

Linux 下段错误 core文件

什么是core dump? core的意思是内存,dump的意思是扔出来,堆出来:当一个程序奔溃时,在进程当前工作目录的core文件中复制了该进程的存储图像.core文件仅仅是一个内存映像(同时加上调试信息),主要用来调试的. 为什么没有core文件生成呢? 有时候程序down了,但是core文件却没有生成.core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置一下便生成core文件了 在linux平台下,设置core dump文件生成的方法:1. 在终端中输入ulimit -c

【Linux】gdb调试core文件

编写服务器端程序,很容易遇到Crash问题,比较幸运的是Linux提供了core file,保留了Crash的现场.有时候,根据当前的调用栈,并且打印出当前栈的变量就可以分析出crash的原因,但是,有时候看到调用栈却束手无策.下面就介绍自己通过GDB的几个命令的结合,发现一个crash的原因的过程. 下面让我们一起进入现场,来逐步发现其中的原因. 首先,还是运行gdb 命令,gdb wbxgs core.5797,来看看现场. [[email protected] bin]# gdb wbxg

Linux生成core文件、core文件路径设置

1.设置core文件大小 列出所有资源的限制: ulimit -a ulimit -a.png 或者查看core file size: ulimit -c core file size:unlimited:core文件的大小不受限制0:程序出错时不会产生core文件1024:代表1024k,core文件超出该大小就不能生成了 设置core文件大小: ulimit -c fileSize 注意: 尽量将这个文件大小设置得大一些,程序崩溃时生成Core文件大小即为程序运行时占用的内存大小.可能发生堆

linux 下core文件生成、路径、格式设置及调试

core文件生成及调试1 代码 #include<stdio.h> int main() { int *p = NULL; *p = 0; return 0; } 2 在当前shell执行ulimit -c unlimited 注意:该命令只在当前shell生效,其他shell会失效ulimit -c是0,生成core文件失败. 3 设置core文件格式和生成路径,默认在执行程序当前目录下,执行以下两条命令: echo "1" > /proc/sys/kernel/c

Linux core 文件介绍

Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以下命令来阻止系统生成core文件:ulimit -c 0下面的命令可以检查生成core文件的选项是否打开:ulimit -a该命令将显示

linux下core文件调试方法(转载)

转自于:http://blog.csdn.net/fcryuuhou/article/details/8507775 在程序遇到段错误不寻常退出时,一般是访问内存出错.但是不会给出程序哪里出现的问题,这个时候就需要core文件来帮助调试. 内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 1)使用ulimit -c命令可查看core文件的生成开关.若结果

(转)Linux core 文件介绍与处理

1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以下命令来阻止系统生成core文件:ulimit -c 0下面的命令可以检查生成core文件的选项是否打开:ulimit -a该命令将显示所有的用户定制,其中选项-a代表“all”. 也可以修改系统文件来调整core选项在/etc/profile通常会有这样一句话来禁止产生core文件,通常这种设置是合

Linux core 文件

http://blog.csdn.net/mr_chenping/article/details/13767609 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 --------------------------------- 1)使用ulimit -c命令可查看core文件的生成开关.若结果为0,则表示关闭了此功能,不会生成c

Linux的Core文件设置与调试

一.运行时错误 任何人写程序都会出错,正如<C++编程规范>所说,真正可怕的错误不是编译时的错误,而是运行时错误. 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误) 这通常都是指针错误(一般就是空指针)引起的,或者访问了不能访问的内存(数组越界,系统保护) 二.core文件 我们不可能用GDB一句一句的去找,真正的英雄都善于使用手中的武器.这就是core file 所谓core,就是当程序down掉的时候,操作系统把程序的内存内容dump下来,这个动作就是core