我正在用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