c - Linux 上的侧线程上的 malloc/calloc 崩溃

标签 c linux unix crash malloc

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

服务器按原样完美运行,但客户端遇到 glibc detected 崩溃(我希望我输入正确)。当它收到响应时,它会解析其结构,其中包含:
a) 标题,
b) 一些静态标识符,
c) 包含长度和数据本身的数据部分。

发生的事情是:
a) 客户端收到数据包,
b) 客户端检查它的大小(至少 sizeof(header) + sizeof(static_data) + sizeof(length) + data -- 数据大小与长度一样大),
c) 创建结构——从字符缓冲区到上面的结构的转换, d) 创建一些其他结构来存储这些结构。

结构被正确解释。我通过服务器接口(interface)向客户端发送“固定”结构并打印原始数据、发送数据和接收信息来测试它。所以事实并非如此。 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)。

这让我想知道这有什么问题吗?这是我的线程问题。看起来有点像我的“内存空间”溢出了,但我对此表示怀疑,因为它总是在收到第一个响应时发生。如果需要任何帮助,我将不胜感激,并且可以发布更多详细信息。侧线程是可连接的。

我编译的选项:
抄送=海合会 CFLAGS = -Wall -ansi --pedantic -c -O0 -g -std=c99 -pthread $(CC) $(CFLAGS) server.c -o server.o gcc server.o $(OBJECTS) -o 服务器 -pthread -lm
并包含在 client.c 文件中:
系统/fcntl.h 网络数据库.h 错误号.h stdio.h unistd.h 标准库.h 字符串.h 时间.h pthread.h 数学.h

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


提前致谢。

最佳答案

当 malloc 崩溃时,通常是因为您之前踩到了它用来管理自身(和免费)的数据。很难或不可能在崩溃时进行诊断,因为问题确实发生在以前的某个时间。正如已经建议的那样,捕捉先前内存覆盖发生位置的最佳方法是通过 valgrind、purify、insure++ 等程序运行您的程序。如果您覆盖了不应该覆盖的内容,它会通知您。 valgrind 是免费软件,可能已经安装好了。它可以像将 valgrind 这个词放在客户端调用字符串中其他所有内容的前面一样简单。

关于c - Linux 上的侧线程上的 malloc/calloc 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111972/

相关文章:

MySQL UDF 只返回整数 - double 想要

c - 序列点和副作用 : Quiet change in C11?

linux - 适用于 Linux 的 PCIe DMA 驱动程序

java - 我如何确定 STDERR 是否在 linux 机器上被缓冲?

c - 如何使用 pthread、pthread_exit 将 * 转换为 double/float

c - ARM汇编指针指向指针?

c - 二维数组和指针。

linux - 使用 -L 如何影响链接器?

linux - 带有额外空格的 Bash 命令替换 : How to solve this?

file - unix 将尾部重定向到文件