core文件的生成与使用

目录

  • core 设置
  • 例子 1
  • 例子 2
  • core 名称及目录修改
  • 参考

在使用嵌入式系统时,出错后,不好使用 gdb 调试,这时,可让系统生成一个 core 文件,用于查看出错原因

core 设置

要生成 core 文件,需要先设置 core 文件大小。

  • 可直接使用 ulimit 命令设置
ulimit -c unlimited

-c 后面为 block 大小, unlimited 为不限制大小

  • 也可使用 RLIMIT_CORE 在程序中进行设置

使用 setrlimit 函数对 RLIMIT_CORE 进行设置

例子 1

使用以下报错程序,编译时加上 -g ,运行后,可在本目录下生成 core 文件

#include 
#include 
#include 
#include 	

static void func0(void)
{
    printf("This is func0 start\n");
    int *p = NULL;
    *p = 1234;
    printf("This is func0 end\n");
}

static void func1(void)
{
    printf("This is func1\n");
    func0();
}

int main(int argc, char **argv)
{
    printf("==main==\n");

    func1();

    return 0;
}

使用 gdb 可以查看报错原因,例子在虚拟机中运行,ulimit_test 为运行程序

gdb ulimit_test core

core文件的生成与使用_第1张图片
可以看到,程序的第 10 行出问题了,使用命令 bt , 能够具体查看运行方式

例子 2

使用 RLIMIT_CORE 设置 core 大小

#include 
#include 
#include 
#include 	

static void func0(void)
{
    printf("This is func0 start\n");
    int *p = NULL;
    *p = 1234;
    printf("This is func0 end\n");
}

static void func1(void)
{
    printf("This is func1\n");
    func0();
}

int main(int argc, char **argv)
{
    printf("==main==\n");

    struct rlimit core_limit;
  	core_limit.rlim_cur = RLIM_INFINITY;
 	core_limit.rlim_max = RLIM_INFINITY;

    int  res = setrlimit(RLIMIT_CORE, &core_limit);

    func1();

    return 0;
}

core文件的生成与使用_第2张图片

core 名称及目录修改

可通过 /proc/sys/kernel/core_pattern 文件写入,修改 core 的名称与生成目录

echo /tmp/core-%e > /proc/sys/kernel/core_pattern

%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 添加命令名

配置完成后,运行程序,会在 /tmp 目录下生成名为 core-ulimit_test 的文件

参考

https://www.cnblogs.com/hustquan/archive/2012/04/01/2428128.html
https://www.cnblogs.com/BinBinStory/p/7248161.html
https://liuyixiang.com/post/50081.html

你可能感兴趣的:(嵌入式,linux,arm)