linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃

我正在用C写一个服务器 - 客户端应用程序,共享一些信息。服务器以双线程模式工作 - 主线程等待输入,而侧线程响应客户端的请求。客户端也是这样工作的,但它等待用户输入(来自stdin),并且如果它接收到正确的命令,它会向服务器发送请求并等待响应。等待在侧线程处理响应中完成。虽然这看起来很好,并在基于Ubuntu的发行版(我使用Ultimate Edition 2.7)上工作,但它在其他发行版上崩溃。这是发生了什么。Linux上的侧线程的malloc/calloc崩溃

服务器完美无缺地工作,但客户患有glibc检测到崩溃(我希望我输入正确)。当它收到响应时,它解析它的结构,它包含:a)头部,

b)一些静态标识符,

c)包含长度和数据本身的数据部分。

发生的是:

一个)客户端收到数据包,

b)中的客户端检查它(大小至少sizeof(header) + sizeof(static_data) + sizeof(length) + data - 和数据大小一样大的长度表示)),

c)创建一个结构 - 从字符缓冲区到上述结构的转换,d)创建一些存储这些结构的其他结构。

结构解释正确。我通过服务器的接口向客户端发送“固定”结构并打印原始数据,发送数据和接收到的信息来测试它。所以情况并非如此。一切都很好点c)。

至点d)我工作在用于接收传入数据包的缓冲区(指定了最大大小和缓冲区的大小)。存储我得到的数据结构。我这样做:

a)分配正确大小的新内存

b)复制数据。

我不是在讨论这个方法。只要它工作都没问题。但正如我所说,它不在其他发行版。它在a)点上的MALLOC分配内存时失败。它在一切上都失败了。我的猜测是,它可能是一个线程安全的malloc和/或printf在其他发行版上的问题,但问题是主线程大多数闲置在scanf(..)方法上。

返回主题:任何事情都会失败:

char* buffer = (char*)malloc(fixed_size * sizeof(char))

STRUCT_T* struct = (STRUCT_T*)malloc(sizeof(STRUCT_T))等等。无论我尝试分配什么,它总是会抛出glibc检测到的错误,并始终指向malloc方法(即使它是calloc)。

这让我想知道那有什么问题吗?这是我的线程问题。看起来有点像我充满'记忆空间',但我怀疑它,因为它总是发生在第一个响应接收。我会很乐意提供任何帮助,如果需要,可以发布更多细节。侧线可以连接。

选项与我编译:

CC = gcc CFLAGS = -Wall -ansi --pedantic -c -O0 -g -std=c99 -pthread $(CC) $(CFLAGS) server.c -o server.o gcc server.o $(OBJECTS) -o server -pthread -lm

和包括client.c文件:

sys/fcntl.h netdb.h errno.h stdio.h unistd.h stdlib.h string.h time.h pthread.h math.h

我不使用C和Linux新手,但我主要是在Windows和C++的工作,所以这是相当令人不安的。正如我所说的,它在我使用的发行版上工作得很好,但在正确解析缓冲区时却没有其他功能。

在此先感谢。

+1

我不认为这与线程直接有关,即使错误的代码可能在您的非主线程中。这几乎肯定是简单的内存损坏(写入缓冲区末尾)。 –

2011-05-24 14:28:08

+1

而规范的解决方案是在valgrind下运行你的程序。不幸的是,您在这里提供的信息不足以让我们给出比这更好的答案。 –

2011-05-24 14:29:29

+0

我无法想象如何。我有一个正常的指针在堆栈上,我尝试动态分配一些东西来指向它。我正在讨论像void* a = malloc(1);这样的正常分配。我会在稍后与valgrind合作。希望能够检测并指定错误。 –

2011-05-24 14:36:27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值