2011-01-25 30 views
0

This fileGoAhead WebServer的一部分,它實現了非常快的塊分配方案。爲什麼我在這裏獲取內存訪問衝突?

在第284行,Web服務器進程隨機崩潰。

} else if ((bp = bQhead[q]) != NULL) { 
/* 
* Take first block off the relevant q if non-empty 
*/ 
    bQhead[q] = bp->u.next; //MEMORY ACCESS VIOLATION HERE 

這有什麼可能的原因?

EDIT
bp的是一個指向這個結構和聯合在this header file

typedef struct { 
    union { 
     void *next;       /* Pointer to next in q */ 
     int  size;       /* Actual requested size */ 
    } u; 
    int   flags;       /* Per block allocation flags */ 
} bType; 

感謝。

+0

你是什麼?我們需要更多的信息 – Mark 2011-01-25 19:29:48

+0

當然你已經知道可能的原因是什麼。當您處理不在您的進程中的內存時,會發生AV。 – 2011-01-25 19:36:31

回答

5

以下是可能的原因。

  • 你搞砸了一些東西,損壞了你的一些數據結構或你的堆棧。

  • bQhead是NULL或無效的指針

  • qbQhead

  • bp邊界之外,通過與調試器的代碼空的或無效的指針

步驟,或者使用printf調試,看看bQhead,q,bp的值是否應該是。

+1

某些調試器還會告訴你無效訪問的地址或指令(在這種情況下,你可以觀察它所引用的寄存器),這也會有幫助。 – asveikau 2011-01-25 19:36:51

+0

好的,謝謝,這給了我一個開始的地方.... – 2011-01-25 19:37:42

1

給我們更多的提示...

可能被另一個線程內存損壞,如果是隨機...

MY2C

1

沒有一個調試器下運行,我猜想,q是超出範圍0到B_MAXCLASS-1。設置q,ballocGetSize()的函數不會執行任何邊界檢查以確保塊類保持在邊界內。

一個簡單的斷言來檢查q是否在限定之內在推斷之前將規定可能性。