c/c++ thread 段错误

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);

还是使用太少了,遗漏了细节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月夜持剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值