关闭

Linux下生成core文件的临时解决方法-RHEL5.X bug

标签: linuxthread多线程null磁盘
3678人阅读 评论(0) 收藏 举报
分类:

第1章 背景

网关Linux系统版本上线后,由于代码中assert判断,导致系统出core。而core文件不像预期中的不带pid,每个core文件后都带有pid,大约1分钟一个core文件,每个文件4G多,导致磁盘空间满,业务出现异常。

登陆现网查看

1.1 系统版本

[mcpp@localhost ~]$ uname -a

Linux localhost.localdomain 2.6.18-238.el5 #1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU/Linux

1.2 系统配置

[mcpp@localhost ~]$ sysctl -a|grep kernel.core_uses_pid

kernel.core_uses_pid = 0 //(次配置标识core文件是否带pid,此处表示不带)

1.3 用户配置

[mcpp@localhost ~]$ ulimit -a

core file size          (blocks, -c) unlimited //(此处不限制core文件大小)

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 16109

max locked memory       (kbytes, -l) 32

max memory size         (kbytes, -m) unlimited

open files                      (-n) 65535

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 16109

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

第2章 测试验证

对于操作系统中关于core文件部分的修改,通过现网查看应该是没有问题,所以怀疑是RELH5.6版本配置core文件不带pid功能失效。测试程序如下:

2.1 一级进程单线程

#include <stdlib.h>

int main()

{

        abort();

        return 0;

}

编译:gcc -m64 -o pidTest pidTest.c

运行:pidTest

结果:出现core文件(不带pid)

-rw------- 1 g-yang g-yang 176128 01-05 17:25 core

2.2 一级进程多线程

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

#include <pthread.h>

#define NUM     3

void *thread_run()

{

        printf("hello, I am thread[%llu]\n", pthread_self());

        sleep(1);

        abort();

        return NULL;

}

int thread_pool_run()

{

        int             i;

        pthread_t       th[NUM];

 

        for(i=0; i<NUM; i++){

                printf("thread create\n");

                pthread_create(&th[i], NULL, thread_run, NULL);

        }

        for(i=0; i<NUM; i++){

                pthread_join(th[i], NULL);

                printf("thread exit\n");

        }

        return 0;

}

int main()

{

        int     stat;

        stat = thread_pool_run();

        pause();

        return 0;

}

编译:gcc -m64 -Wall -lpthread -o multiTest12 multiTest12.c

运行:multiTest12

结果:出现core.2178文件(带pid)

-rw------- 1 g-yang g-yang 31817728 01-05 17:25 core.2178

2.3 二级进程单线程

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

        int     stat;

        pid_t   pid;

        if((pid = fork()) < 0){

                printf("fork error\n");

        }else if(pid == 0){

                abort();

        }

        pause();

        return 0;

}

编译:gcc -m64 -Wall -lpthread -o multiTest2 multiTest2.c

运行:multiTest2

结果:出现core文件(不带pid)

-rw------- 1 g-yang g-yang 208896 01-05 17:25 core

2.4 二级进程多线程

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

#include <pthread.h>

#define NUM     3

void *thread_run()

{

        sleep(1);

        abort();

        return NULL;

}

int thread_pool_run()

{

        int             i;

        pthread_t       th[NUM];

 

        for(i=0; i<NUM; i++){

                pthread_create(&th[i], NULL, thread_run, NULL);

        }

        for(i=0; i<NUM; i++){

                pthread_join(th[i], NULL);

        }

        return 0;

}

int main()

{

        int     stat;

        pid_t   pid;

        if((pid = fork()) < 0){

                printf("fork error\n");

        }else if(pid == 0){

                stat = thread_pool_run();

                exit(stat);

        }

        pause();

        return 0;

}

编译:gcc -m64 -Wall -lpthread -o multiTest22 multiTest22.c

运行:multiTest22

结果:出现core.1677文件(带pid)

-rw------- 1 g-yang g-yang 31817728 01-05 17:25 core.1677

2.5 三级进程单线程

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

        pid_t   pid;

 

        if((pid = fork()) < 0){

                printf("fork1 error\n");

        }else if(pid == 0){

                printf("fork1 successful\n");

                if((pid = fork()) < 0){

                        printf("fork2 error\n");

                }else if(pid == 0){

                        printf("fork2 successful\n");

                        abort();

                }

                pause();

        }

        pause();

        return 0;

}

编译:gcc -m64 -Wall -lpthread -o multiTest3 multiTest3.c

运行:multiTest3

结果:出现core文件(不带pid)

-rw------- 1 g-yang g-yang 208896 01-05 17:25 core

2.6 三级进程多线程

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

#include <pthread.h>

#define NUM     3

void *thread_run()

{

        printf("hello, I am thread[%llu]\n", pthread_self());

        sleep(1);

        abort();

        return NULL;

}

int thread_pool_run()

{

        int             i;

        pthread_t       th[NUM];

 

        for(i=0; i<NUM; i++){

                printf("thread create\n");

                pthread_create(&th[i], NULL, thread_run, NULL);

        }

        for(i=0; i<NUM; i++){

                pthread_join(th[i], NULL);

        }

        return 0;

}

 

int main()

{

        int     stat;

        pid_t   pid;

        if((pid = fork()) < 0){

                printf("fork1 error\n");

        }else if(pid == 0){

                printf("fork1 successful\n");

                if((pid = fork()) < 0){

                        printf("fork2 error\n");

                }else if(pid == 0){

                        printf("fork2 successful\n");

                        stat = thread_pool_run();

                        exit(stat);

                }

                pause();

        }

        pause();

        return 0;

}

编译:gcc -m64 -Wall -lpthread -o multiTest32 multiTest32.c

运行:multiTest32

结果:出现core.2618文件(带pid)

-rw------- 1 g-yang g-yang 10833920 01-05 17:25 core.2618

2.7 测试结论

RELH5.6版本系统配置core文件不带pid功能kernel.core_uses_pid=0

1) 对单线程有效(无论是几级进程);

2) 对多线程失效(无论是几级进程)。

第3章  RELH技术支持答复

我查过了代码并做了测试,发现在 RHEL5.6 中对于多线程的进程(即多个任务共享同一个内存空间的情况),  core_uses_pid=0 是不起左右的。

内核总是会在产生的 core 文件名中加上 pid.     这个问题在 RHEL 5.7 及最新的内核中还是这样.    在 RHEL 6.1 中就不一样了, RHEL6.1 内核中不把多线程任务做特殊处理.

我不太明白,为什么你们非要 不使用 core.pid ?  想要控制 core 文件的数量吗? 

控制 core 文件的数量可以有很多方法的,  比如用 inotify() 写一个程序监控目录,当core 文件数量超出时,删除多余的文件.

另外一个方法是我们可以用 kprobes 写一个内核模块,截取内核的  format_corename() 函数,改写其产生的 corename, 去掉.pid 部分。

第4章 解决方法

4.1 不产生core文件

在.bashrc脚本里将下面的设置注释掉

#ulimit -c unlimited

并确定core file size大小为0

-bash-3.2$  ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 28852

max locked memory       (kbytes, -l) 32

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 28852

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

 

互通现网出core以后,将磁盘空间占满,临时解决方法就是不产生core文件。

优点:

1) 方法简单,避免产出大量core文件将磁盘占满。

缺点:

1)不利于查找异常问题。

4.2 core文件统一改名

在用户根目录创建定时任务,每分钟执行一次,将根目录下所有文件夹里的core文件mv到指定的 目录并改名为core,脚本如下:

#!/bin/bash

find . -name "core.*" > bug.lst

while read line

do

mv $line ./temp/core

done<bug.lst

 

优点:

1)保留了部分异常信息。

缺点:

1) 浪费系统资源,不断的产生core文件,大约1分钟1个,互通一般为4G多。

4.3 core文件目录指向限制磁盘

单独划分一个磁盘分区,用于存放core文件,将所有core文件指向新划分的磁盘空间,以root用户修改系统参数如下:

-bash-3.2$  vi /etc/sysctl.conf

新增如下一行

kernel.core_pattern = /home/g-yang/temp/

优点:

1)保留了部分异常信息。

缺点:

1)方式太土,不建议使用。
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux开启或关闭core文件的生成

用以下命令来阻止系统生成core文件: ulimit -c 0 下面的命令可以检查生成core文件的选项是否打开: ulimit -a 该命令将显示所有的用户定制,其中选项-a代表“all”。...
  • wgaoqg
  • wgaoqg
  • 2012-02-08 10:56
  • 3738

Linux下core文件产生的一些注意问题

前面转载了一篇文章关于core文件的产生和调试使用的设置,但在使用有一些需要注意的问题,如 在什么情况 才会正确地产生core文件。       列出一些常见问题: 一,如何使用core文件 ...
  • fengxinze
  • fengxinze
  • 2011-09-22 13:28
  • 25346

如何查看core文件

在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的,本文对此做简单介绍。例如,一个程序cmm_test_tool在运行的时候...
  • chaoi
  • chaoi
  • 2007-07-16 08:49
  • 24271

linux下产生core文件以及不产生core文件的条件

原文:http://team.eyou.com/?p=27 Linux下,产生core文件,和不产生core文件的条件: 当我们的程序崩溃时,内核有可能把该程序当前内存映射到c...
  • zz709196484
  • zz709196484
  • 2017-02-04 23:13
  • 2673

清除VS2012生成的不必要文件

VS2012生成的项目文件中会有一个与解决方案同名的sdf文件,并且比较大,可以删除的,具体方法如下: 英文版步骤如下: Tools->Options->Text Editor->C/C+...
  • oXiaoMing123
  • oXiaoMing123
  • 2015-10-19 19:28
  • 2356

解决linux系统下因分区目录划分过小,导致tomcat使用系统临时文件夹(/tmp)没有足够空间而报错的问题

解决linux系统下因分区目录划分过小,导致tomcat使用系统临时文件夹(/tmp)没有足够空间而报错的问题1. 故障现象.B/S应用进行文件上传后,系统反馈:没有足够的磁盘空间(No enough...
  • u011138447
  • u011138447
  • 2016-05-07 16:51
  • 5144

在linux下利用程序崩溃后的core文件分析bug

浅析Linux下core文件 当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方。最常出 现的,几乎所有C程序员都出现过的错误就是“段错误”了。...
  • Andeewu
  • Andeewu
  • 2014-08-20 21:44
  • 1406

在linux下利用程序崩溃后的core文件分析bug

浅析Linux下core文件 浅析Linux下core文件 张华 (zhanghua@eyou.net) 2006 年 8 月 02 日  ...
  • youkuxiaobin
  • youkuxiaobin
  • 2011-11-13 10:32
  • 816

【转载】linux下core文件调试方法

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。 1.core文件的...
  • moses_wm
  • moses_wm
  • 2016-11-07 17:43
  • 88

Linux下core文件调试方法

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。 1.core文件的...
  • tomew
  • tomew
  • 2011-10-28 16:59
  • 357
    个人资料
    • 访问:85648次
    • 积分:1924
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:9篇
    • 译文:0篇
    • 评论:8条
    文章分类