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;
} 自己踢一下,没人对这个问题有兴趣? 回复 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. }
core dump有触发条件的,
一般内核态的问题基本会触发,
用户态上的就要看情况了。 回复 3# younghuster
这样写就是想控制主线程出错还是子线程出错,因为是简单测试,没有写成参与,写成了宏定义的,我说的测试是
修改一下CRASH_TID的值再测试,定义为20的时候,Core Dump就有问题了,有时候产生有时候不产生。
页:
[1]