c/c++ thread 段错误
最近写一个socket 相关的demo,便于理解相关属性,为了适配多个客户端, 使用了线程,但不知道怎么了只要创建线程后就莫名其妙的程序崩溃。整了大半下午,最后通过gdb 调试 查看 内核信息发现是线程传入参数的问题导致指针指向未知的内存使其程序崩溃。
具体错误代码如下:
void * client_run(void *arg) {
int csd = *(int *)arg;
printf(" client_run csd:%d\n", csd);
}
int main(){
int csd = 1;
pthread_t tid;
int err = pthread_create(&tid, NULL, client_run, (void *)csd);
if(err != 0) {
printf("can't create thread: %s\n", strerror(err));
return -1;
}
pthread_join(tid, NULL);
return 0;
}
这个传入参数我直接把csd的值强转成void * 指针类型,在client_run的参数void * arg 强转int类型会报错。
但程序崩溃的时候当时查半天都没有找到具体位置。
系统会在程序崩溃的那一刹那将整个内核的信息记录在一个文件里边
可以通过命令ulimit -a查看 core file size,使用ulimit -c unlimited设置为无上限
编译的时候需要添加 -g
g++ -g -MP -MMD -c -o bin/socket_server.o socket_server.cpp
g++ bin/socket_server.o -lpthread -o bin/socket_server
执行后程序崩溃后会在执行文件的同级目录生成对应的core文件。
可以看到直接体现在client_run 下的 int csd = *(int *)arg; 报错
通过这个信息找到是线程参数传入错误,应该传入参数的地址而不是值。(还是不熟练的原因)
修改后代码
int err = pthread_create(&tid, NULL, client_run, &csd);
还是使用太少了,遗漏了细节。