Cyberman.Wu 发表于 2013-03-18 16:36

Core Dump和多线程:系统有缺陷?

最近程序偶尔出一些异常问题,想应用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。

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

#define NR_THREADS      64
// #define CRASH_TID       20
#define CRASH_TID       65

void *thread_func(void *arg)
{
    long id = (long)arg;

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

    for ( ; ; )
    {
      sleep(1);
    }

    return NULL;
}


int main(int argc, char *argv[])
{
    int i;
    int ret;
    pthread_t tids;
    for (i = 0; i < 64; ++i)
    {
      ret = pthread_create(&tids, NULL, thread_func, (void *)(long)i);
      if (ret)
      {
            fprintf(stderr, "Creating thread #%d failed with %d!\n", i, ret);
            exit(2);
      }
    }

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

    for ( ; ; )
    {
      sleep(1);
    }

    return 0;
}

Cyberman.Wu 发表于 2013-03-19 15:35

自己踢一下,没人对这个问题有兴趣?

younghuster 发表于 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.    }

zyr-linux 发表于 2013-04-10 09:54

core dump有触发条件的,
一般内核态的问题基本会触发,
用户态上的就要看情况了。

Cyberman.Wu 发表于 2013-04-10 17:41

回复 3# younghuster


这样写就是想控制主线程出错还是子线程出错,因为是简单测试,没有写成参与,写成了宏定义的,我说的测试是
修改一下CRASH_TID的值再测试,定义为20的时候,Core Dump就有问题了,有时候产生有时候不产生。
页: [1]
查看完整版本: Core Dump和多线程:系统有缺陷?