配置core文件

来源:互联网 发布:mac英文全角 编辑:程序博客网 时间:2024/05/17 02:03


一、core文件和gdb的结合使用调试 -- 仅限在同一终端执行一次下面2条


//cd /proc/sys/kernel
1、echo "/tmp/core-%e-%p-%t" > core_pattern  // 指定生成core文件的路径和名称
2、echo "1" > core_uses_pid                  // 生成core文件带pid作为扩展名


//ulimit -a 
1、ulimit -c unlimited // 配置这些和操作执行文件要在同一终端? 否则生成不了core,此问题待后续解决...
2、ulimit -c      // 查看配置是否成功


// gdb调试
1、g++ -g main.cpp  -o main // 编译时加-g参数才会生成core文件
2、./main         //执行生成的可执行文件---显示(core dumped)表示生成core文件


//用gdb查看出错地方--单线程和多线程都可用gdb调试core文件-如果是在开发板上生产的core文件需要用arm-gdb
3、gdb  /home/test/main    core-main-6046-1347616061    
     //可执行文件路径   //生成的core文件名
4、 where(或bt)       //显示出错信息--函数和行号等
5、up/down查看函数的执行情况
6、p xx/&x  打印变量的值或者地址








二、辅助材料
我们在用ulimit这个命令的时候主要是为了产生core文件,就是程序运行发行段错误时的文件:


http://www.cnblogs.com/qq78292959/archive/2012/05/08/2490443.html


1、ulimit -c unlimited  // 把core文件的大小设置为无限大,同时也可以使用数字来替代unlimited,对core文件的上限制做更精确的设定,一般默认情况下,core文件的大小被设置为0,这样系统就不dump出core文件了。这时,使用命令:ulimit -c unlimited进行设置. ulimit -c 可以查看是否打开此选项,若为0则为关闭;
开启或关闭core文件的生成
ulimit -c 可以查看是否打开此选项,若为0则为关闭;
ulimit -c 0可手动关闭
ulimit -c 1000 为设置core文件大小最大为1000kbyte


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








2、ulimit -a     // 查看将显示所有的用户定制—查看限制情况


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


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


2)、echo "/tmp/core-%e-%p-%t" > core_pattern
     将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
     这些操作一旦计算机重启,则会丢失,如果你想持久化这些操作,可以在 /etc/sysctl.conf文件中     增加:kernel.core_pattern=/tmp/core%p


3)、echo "1" > 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;




三、举例
在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误”(segmentation fault)这样的问题,这主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10M。我一般把stack size设置成256M,这样就没有段错误了!命令为: 
ulimit   -s 262140  
如果要系统自动记住这个配置,就编辑/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit   -s 262140”,保存重启系统就可以了!  
1]在RH8的环境文件/etc/profile中,我们可以看到系统是如何配置ulimit的: 
#grep ulimit /etc/profile 
ulimit -S -c 0 > /dev/null 2>&1 
这条语句设置了对软件资源和对core文件大小的设置 
把你要设置的ulimit放在/etc/profile这个环境文件中. 
ulimit 命令设置或报告用户进程资源极限,如 /etc/security/limits 文件所定义。文件包含以下缺省值极限:  
fsize = 2097151 
core = 2097151 
cpu = -1 
data = 262144 
rss = 65536 
stack = 65536 
nofiles = 2000  
当新用户添加到系统中时,这些值被作为缺省值使用。当向系统中添加用户时,以上值通过 mkuser 命令设置,或通过 chuser 命令更改。  
极限分为软性或硬性。通过 ulimit 命令,用户可将软极限更改到硬极限的最大设置值。要更改资源硬极限,必须拥有 root 用户权限。  
很多系统不包括以上一种或数种极限。 特定资源的极限在指定 Limit 参数时设定。Limit 参数的值可以是每个资源中指定单元中的数字,或者为值 unlimited。要将特定的 ulimit 设置为 unlimited,可使用词 unlimited。  
    注:在 /etc/security/limits 文件中设置缺省极限就是设置了系统宽度极限, 而不仅仅是创建用户时用户所需的极限。  
省略 Limit 参数时,将会打印出当前资源极限。除非用户指定 -H 标志,否则打印出软极限。当用户指定一个以上资源时,极限名称和单元在值之前打印。如果未给予选项,则假定带有了 -f 标志。  
由于 ulimit 命令影响当前 shell 环境,所以它将作为 shell 常规内置命令提供。如果在独立的命令执行环境中调用该命令,则不影响调用者环境的文件大小极限。以下示例中正是这种情况:  
nohup ulimit -f 10000 
env ulimit 10000  



原创粉丝点击