2011-01-25 33 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是否在限定之内在推断之前将规定可能性。