2016-10-06 3 views
1

많은 문제로 인해이 오류를 디버깅하는 방법을 모르겠습니다. 내가 할 수 있었던 것은 프로그램의 일부를 주석 처리하고 프로그램의 어느 부분에서 오류가 발생했는지 추적하기 위해 반복적으로 컴파일하는 것입니다.이 부분은 오류를 생성합니다 :스레드를 만들 때 세그먼트 오류 (코어 덤프) 오류가 발생했습니다.

여기 스레드를 만들고 싶습니다. : 어쩌면 그것은 또한 스레드가 생성 될 때 호출되는 strikeMultiples 기능으로 인해 발생할 수

int j = 0; //not the actual value, just showing that j is of type int 
pthread_create(&thread_id, NULL, strikeMultiples, (void*)j); 

는 :

static void* strikeMultiples(void* prime) { 
    int * primej = (int *) prime; 
    int j = *primej; 
    free (prime); 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 
+2

, 따라서 스레드 PROC에서'primej' 이후 역 참조의 형성은 잘못이다. 'int j = (int) prime;'은 현실에 더 가깝지만 여전히 "정확하지"않습니다. 올바르게 실행하려면, proc의'j' inbound와'j'는'intptr_t' 또는'uintptr_t'이어야하고'free'는 관계없이 제거되어야합니다. 즉, 모든 종류의 추측입니다. 우리는'j'가 첫 번째 스 니펫에 있거나 그 출처가 어디인지 알지 못합니다. – WhozCraig

답변

2

문제는 당신이에 캐스트 기능 (에 int을 통과한다는 것입니다 void *) 이어서 int *으로 읽으려고 시도합니다.

freemalloc 및 가족으로부터 반환되지 않은 항목도 있습니다.

int 값의 주소를 전달하고 기능에서 free을 전달하지 마십시오. 또한 void *과 비 함수 포인터 사이에 캐스트 할 필요가 없습니다. j`가 pthread_create``에`int`, 당신이 통과하지 않는`INT *`있다`가정

static void* strikeMultiples(void* prime) { 
    int *primej = prime; 
    int j = *primej; 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 

... 

pthread_create(&thread_id, NULL, strikeMultiples, &j); 
+0

주 : 스레드 작성자의'j'는 스레드에서 마지막 사용 전에 자동 제거 (범위를 벗어남)가 발생하지 않도록주의해야합니다. 경주 조건은 로컬 자동 바의 주소를 쓰레드 생성에 전달하는 실수는 * 우연히 * 쉽게 * 산발적 인 실패 특성으로 인해 추적하기가 쉽지 않은 경우가 많습니다. 'int' 또는'unintptr_t'와 같은 값으로'j'를 전달하거나 스레드에 의해 해제 된 동적 메모리 또는 다른 많은 옵션들은 이것을 막을 것입니다 – WhozCraig

관련 문제