2011-01-25 2 views
0

This file은 매우 빠른 블록 할당 체계를 구현하는 GoAhead WebServer의 일부입니다.왜 메모리 액세스 위반이 발생합니까?

라인 284에서 웹 서버 프로세스가 임의의 시간에 충돌합니다.

} 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 

가능한 원인은 무엇입니까?

편집
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

+0

확실하게 당신은 가능한 이유가 무엇인지 이미 알고 있습니다. AV는 프로세스에없는 메모리를 처리 할 때 발생합니다. –

답변

5

가능한 이유는 다음과 같습니다.

  • 데이터 구조 나 스택이 손상되어 일부가 손상되었습니다.

  • bQhead

    디버거로 코드를 통해 NULL 또는 잘못된 포인터

단계

  • qbQhead

  • bp의 경계 외부에있는 NULL 또는 잘못된 포인터이다 , 또는 printf 디버깅을 사용하여 bQhead, q, bp 값이 맞는지 확인하십시오.

  • +1

    일부 디버거는 잘못된 액세스 주소 나 지침 (참조하는 레지스터를 확인할 수있는 경우)을 알려주며 이는 도움이 될 것입니다. – asveikau

    +0

    좋아, 고마워. 시작 할 곳이 .... –

    1

    우리에게 많은 힌트를 줄 ... 다른 스레드에 의해

    아마

    메모리 손상, 그것은 임의의 경우 ... 디버거에서 실행하지 않고

    my2c

    +0

    다른 스레드가 문제인지 어떻게 알 수 있습니까?이 경우 무엇을 찾겠습니까? –

    +0

    가장 좋은 방법은 메모리 디버거를 사용하여 손상 여부를 확인하는 것입니다. 나는 리눅스에서 valgrind를 사용한다. 나는 전기 울타리를 오래 전에 사용 해왔다. 이런 종류의 일을 시도해 볼 수 있습니다. 스레딩과 관련하여 정적 분석을 시도 할 수 있습니다. 데이터 구조를 사용하는 모든 스레드를 찾습니다. – neuro

    1

    을, 그 q는 것 같다 것 0 ~ B_MAXCLASS-1 범위를 벗어났습니다. q를 설정하는 함수 ballocGetSize()은 블록 클래스가 범위 내에 있는지 확인하기 위해 경계를 검사하지 않습니다.

    역 참조 전에 q가 범위 내에 있는지 확인하는 간단한 어설 션을 통해 가능성을 배제 할 수 있습니다.

    +0

    나는이 "else if"의 주된 "if"문장이 이것을 체크하고 있다고 생각한다. 맞습니까? "if (q> = B_MAX_CLASS) {"line 246 –

    +1

    아, 그렇습니다. 그리고 ballocGetSize()를 보면 q는 음수가 될 수 없습니다. (음의 int로 롤링되지 않는 한) 배열 자체가 손상 될 수 있습니다. – CoreyStup

    관련 문제