目录
- 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 <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
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
可以看到,程序的第 10 行出问题了,使用命令 bt , 能够具体查看运行方式
例子 2
使用 RLIMIT_CORE
设置 core 大小
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
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 名称及目录修改
可通过 /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