#ifndef SYS_WIN
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#endif
int coredump_file_set(void)
{
#ifndef SYS_WIN
//配置core文件的生成格式
#define CORE_FILE_SIZE (1024*1024*100)
#define KERNEL_PATTERN_FILE "/proc/sys/kernel/core_pattern"
#define CORE_PATH "/home/sysadm/core.%e.%E"
//去掉core文件中的进程号,以免生成多个core文件,占用flash空间
#define CORE_FILE_DEL_PID "/proc/sys/kernel/core_uses_pid"
#define CORE_FILE_PID_VAL "0"
struct rlimit rlim;
getrlimit(RLIMIT_CORE, &rlim);
rlim.rlim_cur = rlim.rlim_max = CORE_FILE_SIZE;
int ret = setrlimit(RLIMIT_CORE, &rlim);
if (ret < 0) {
perror("setrlimit");
return -1;
}
ret = system("mkdir -p /home/sysadm");
if (-1 == ret)
{
perror("system error!");
return -1;
}
int core_pattern_fd = open(KERNEL_PATTERN_FILE, O_RDWR | O_NDELAY | O_TRUNC, 0666);
if (core_pattern_fd < 0) {
perror("open KERNEL_PATTERN_FILE");
return -1;
}
ret = write(core_pattern_fd, CORE_PATH, strlen(CORE_PATH));
if (ret < 0) {
perror("write KERNEL_PATTERN_FILE");
}
close(core_pattern_fd);
core_pattern_fd = open(CORE_FILE_DEL_PID, O_RDWR | O_NDELAY | O_TRUNC, 0666);
if (core_pattern_fd < 0) {
perror("open CORE_FILE_DEL_PID");
return -1;
}
ret = write(core_pattern_fd, CORE_FILE_PID_VAL, strlen(CORE_FILE_PID_VAL));
if (ret < 0) {
perror("write CORE_FILE_DEL_PID");
}
close(core_pattern_fd);
return ret;
#endif
}
- 测试用例使用APP scsMonitor,其它app类似的操作。
- 查询scsMonitor的进程号,红色标记位置;
[root@buildroot bin]$ ps -aux | grep scsMonitor
root 1407 0.0 0.0 2236 372 pts/1 S+ 19:13 0:00 grep scsMonitor
root 24375 11.5 0.3 166228 3524 pts/0 Sl+ 19:11 0:15 ./scsMonitor
3.使scsMonitor进程号24375产生段错误;
[root@buildroot bin]$ kill -11 24375
解析:-11:表示SEGV段错误编号,此处为数字十一,可以通过kill -l查看。
4.scsMonitor产生core文件;
5.查看/home/sysadm/路径下是否产生core文件,一定要确保core文件是按照如下两部分格式生成,这样无论app产生多少次段错误都只有一份,不会占满flash的空间。