linux下代码生成core文件

我们都知道在linux环境下,通过ulimit -c size 命令能方便的打开或关闭coredump功能,从而生成core文件,便于调试。但是对于如何用代码控制生成core文件,可能很多人就不知道了。我们一起来看下,其实也很简单。

首先需要了解两个函数:

       int getrlimit(int resource, struct rlimit *rlim);
       int setrlimit(int resource, const struct rlimit *rlim);

这两个函数可以对系统的一些资源进行设置,比如打开的进程数、文件数、生成的core文件大小等。

对于我们关心的生成core文件,需要将第一个参数int resource设置为RLIMIT_CORE即可。这样通过第二参数中的设置,可以很方便的对生成的core大小进行控制。

示例代码如下:

test.h文件:

#include <sys/time.h>
#include <sys/resource.h>
int set_core(int core_size)
{
   struct rlimit rlim;
   rlim.rlim_cur = core_size;
   rlim.rlim_max = core_size;
  int ret = setrlimit(RLIMIT_CORE, &rlim);
  if( ret != 0 )
{
 printf("setrlimit | set core size failed, ret=%d\n", ret);
 return ret;
}
 printf("setrlimit | set core size successfully, ret=%d, core_size=%d\n", ret, core_size);

return ret;
}

int get_core(int* limit_cur, int* limit_max)
{
   struct rlimit rlim;
  int ret = getrlimit(RLIMIT_CORE, &rlim);
  if( ret != 0 )
{
 printf("getrlimit | get core size failed, ret=%d\n", ret);
 return ret;
}
 printf("getrlimit | get core size successfully, ret=%d, limit_cur:%lu, limit_max:%lu \n", ret, rlim.rlim_cur, rlim.rlim_max);

 *limit_cur = (int)rlim.rlim_cur;
 *limit_max = (int)rlim.rlim_max;

return ret;
}

int test_core()
{
  int set_core_size = 1024;
  int get_cur = 0;
  int get_max = 0;
  get_core(&get_cur, &get_max);
  set_core(set_core_size);
 get_core(&get_cur, &get_max);

 return 0;
}

test.cpp文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "test.h" 

int main()
{

     test_core();
     int* p = NULL;
     *p = 123;

   return 0;
}

输出:

[email protected]:/home/demo_test# ./test

getrlimit | get core size successfully, ret=0, limit_cur:20480, limit_max:20480

setrlimit | set core size successfully, ret=0, core_size=1024

getrlimit | get core size successfully, ret=0, limit_cur:1024, limit_max:1024

段错误 (核心已转储)

生成的文件:

[email protected]:/home/demo_test# ll

ls: 3·????? 10496

-rw-r----- 1 root root 10723328  4月 17 19:02 core

-rwxr--r-- 1 root root       22  4月 17 15:27 make.sh

-rwxr-xr-x 1 root root     8748  4月 17 19:24 test

-rw-r--r-- 1 root root      276  4月 16 19:31 test.cpp

-rw-r--r-- 1 root root     1389  4月 16 16:06 test.h

我们看到,在当前目录下生成了core文件,大小是10723328字节,后续就可以使用这个core文件进行调试了。这样的方法对于在线服务的程序来说尤为有用,尤其是当崩溃的几率很低的时候,省下大量的时间去蹲守进程崩溃。

不过这里面也有一个问题,我目前也没有搞清楚,就是当我在set_core函数里面设置的core文件大小是1024字节时,生成的core文件还是10723328,好像做的大小设置没有生效,不知道为什么。有知道原因的大虾可以@我沟通交流。

时间: 2024-11-17 07:39:26

linux下代码生成core文件的相关文章

Linux下设置Core文件生成路径及文件名

修改core dump文件路径: 方法1:临时修改: 修改/proc/sys/kernel/core_pattern文件/proc目录本身动态加载每次系统重启都会重新加载因此种方法只能作临时修改/proc/sys/kernel/core_pattern例:echo '/var/log/%e.core.%p' > /proc/sys/kernel/core_pattern 方法2:永久修改: 使用sysctl -w name=value命令例:/sbin/sysctl -w kernel.core

linux下生成core dump文件方法及设置【转】

转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has te

什么是core dump linux下用core和gdb查询出现&quot;段错误&quot;的地方

什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-3193279.html 有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误". 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自

linux下SVN忽略文件/文件夹的方法

linux下SVN忽略文件/文件夹的方法 假设想忽略文件temp 1. cd到temp所在的目录下: 2. svn propedit svn:ignore . 注意:请别漏掉最后的点(.表示当前目录),如果报错请看下面 3. 打开的文件就是忽略列表文件了(默认是空的),每一行是一项,在该文件中输入temp,保存退出 4. svn st查看状态,temp的?状态已经消除了 如果在svn propedit svn:ignore .时报错:svn: None of the environment va

Linux下压缩某个文件夹(文件夹打包)

tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件.zip 压缩方法:压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归zip [参数] [打包后的文件名] [打包的目录路径]解压 unzip xahot.zip 不解释linux zip命令的基本用法是:linux zip命令参数列表:-a 将文件转成ASCI

Linux下删除乱码文件

Linux下删除乱码文件: 1. ls -i 列出文件的节点ID, 如: 123456789 2. find ./ -inum 123456789 -print -exec rm -rf {} \; 批量删除: for n in 123456789 987654321;do find . -inum $n -exec rm -f {} \;;done

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

Linux下的压缩文件剖析 (tar/gzip的区别)

Linux下的压缩文件剖析 对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了.本文就来对这些常见的压缩文件进行一番小结,希望你下次遇

Linux下的各类文件

.a文件是静态链接库文件.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源..a文件就是多个.o文件的组合. .so文件是共享库文件(动态链接).动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息).仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的.so之间建立链接关系. .