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
總結
以上是生活随笔為你收集整理的linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: crt无法网络连接linux开发板,se
- 下一篇: linux下raid磁盘阵列的命名,li