免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2253 | 回复: 4
打印 上一主题 下一主题

[系统] Core Dump和多线程:系统有缺陷? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-18 16:36 |只看该作者 |倒序浏览
最近程序偶尔出一些异常问题,想应用Core Dump文件,开始用简单例子测试是OK的,但做了一个多线程的例子测试时
却发现出现一些奇怪的问题:
1)如果主线程出问题,多数可以记录下core dump文件,但有时候出错之后并不立即退出,并且此时并不产生core dump;
      而dmesg总能看到一条新记录产生了。
2)在其它线程中产生异常,多数时候不产生core,但偶尔也产生过几次,还没找到什么规律。

用abort()来产生core dump,结果类似。

难道是Linux对于多线程环境中的core dump支持有问题,或者需要什么额外的配置?

我用的是CentOS 6.2 for x86_64,内核版本2.6.32-220.el6.x86_64。

程序非常简单:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>

  4. #define NR_THREADS      64
  5. // #define CRASH_TID       20
  6. #define CRASH_TID       65

  7. void *thread_func(void *arg)
  8. {
  9.     long id = (long)arg;

  10.     if (id == CRASH_TID)
  11.     {
  12.         printf("Will crash after serveral seconds ...\n");
  13.         // sleep(3);
  14.         sleep(10);
  15.         *(int *)0xffffffffffffffff = 0;
  16.         // abort();
  17.     }

  18.     for ( ; ; )
  19.     {
  20.         sleep(1);
  21.     }

  22.     return NULL;
  23. }


  24. int main(int argc, char *argv[])
  25. {
  26.     int i;
  27.     int ret;
  28.     pthread_t tids[NR_THREADS];
  29.     for (i = 0; i < 64; ++i)
  30.     {
  31.         ret = pthread_create(&tids[i], NULL, thread_func, (void *)(long)i);
  32.         if (ret)
  33.         {
  34.             fprintf(stderr, "Creating thread #%d failed with %d!\n", i, ret);
  35.             exit(2);
  36.         }
  37.     }

  38. #if CRASH_TID >= NR_THREADS
  39.     printf("Core dump soon ...\n");
  40.     // sleep(1);
  41.     *(int *)0xffffffffffffffff = 0;
  42.     // abort();
  43. #endif

  44.     for ( ; ; )
  45.     {
  46.         sleep(1);
  47.     }

  48.     return 0;
  49. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-03-19 15:35 |只看该作者
自己踢一下,没人对这个问题有兴趣?

论坛徽章:
0
3 [报告]
发表于 2013-04-09 23:46 |只看该作者
回复 2# Cyberman.Wu


在线程函数中,传入的id值为0~63,永远不会进入下面的if语句中,创建的新线程一直休眠,只有主线程执行*(int *)0xffffffffffffffff = 0;才会coredump
13.    if (id == CRASH_TID)

14.    {

15.        printf("Will crash after serveral seconds ...\n");

16.        // sleep(3);

17.        sleep(10);

18.        *(int *)0xffffffffffffffff = 0;

19.        // abort();

20.    }

论坛徽章:
0
4 [报告]
发表于 2013-04-10 09:54 |只看该作者
core dump有触发条件的,
一般内核态的问题基本会触发,
用户态上的就要看情况了。

论坛徽章:
0
5 [报告]
发表于 2013-04-10 17:41 |只看该作者
回复 3# younghuster


这样写就是想控制主线程出错还是子线程出错,因为是简单测试,没有写成参与,写成了宏定义的,我说的测试是
修改一下CRASH_TID的值再测试,定义为20的时候,Core Dump就有问题了,有时候产生有时候不产生。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP