#ifndef SYS_WIN #include#include #include #include #include #include #include #include #include #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的空间。