세그먼테이션 폴트 원인을 못찾겠습니다
글쓴이: basic0968 / 작성시간: 수, 2019/04/10 - 2:03오전
아래 div_array에서 쓰레드를 사용하지 않으면 잘돌아가는데 사용하면 오류가 나네요.
pth_create사용이 미숙해서 그런것 같은데 아무리 생각해도 뭐가 원인일지를 모르겠습니다
int *array = NULL; void *div_array(void *arg); void merge_sort(int *, unsigned int); typedef struct argument{ int *arr; int start,end; }arg; void *left_sort(void *size) { int s = *((int *)size); int middle = s/2; arg x={array,0,middle}; div_array((void *)&x); } void *right_sort(void *size) { int s = *((int *)size); int middle = s/2; arg x={array,middle +1,s}; div_array((void *)&x); } void merge(int *arr, int start, int middle, int end) { int *arr_left, *arr_right; int left = 0, right = 0; int count = 0; arr_left = (int*)malloc(sizeof(int) * (middle - start + 2)); arr_right = (int*)malloc(sizeof(int) * (end - middle + 1)); for(count = 0 ; count <= middle - start ; count ++) { arr_left[count] = arr[start + count]; } arr_left[count] = CHECK_END; for(count = 0 ; count < end - middle ; count ++) { arr_right[count] = arr[middle + count + 1]; } arr_right[count] = CHECK_END; for(count = start ; count <= end ; count ++) { if((arr_left[left] == CHECK_END || arr_left[left] > arr_right[right]) && arr_right[right] != CHECK_END) { arr[count] = arr_right[right ++]; } else arr[count] = arr_left[left ++]; } free(arr_left); free(arr_right); } void *div_array(void *darg) { pthread_t thread_x,thread_y; arg *p = (arg*)darg; int middle = (p->start + p->end) / 2; arg x[2] = {{p->arr, p->start, middle},{p->arr,middle+1,p->end}}; printf("11"); if(p->start < p->end) { pthread_create(&thread_x, NULL, div_array,(void *)&x[0]); pthread_create(&thread_y, NULL, div_array,(void *)&x[1]); pthread_join(thread_x, NULL); pthread_join(thread_y, NULL); // div_array((void *)&x[0]); // div_array((void *)&x[1]); merge(p->arr, p->start, middle, p->end ); } } void sort_merge(int size) { pthread_t tid[2]; size = size - 1; pthread_create(&tid[0], NULL, &left_sort, &size); pthread_create(&tid[1], NULL, &right_sort, &size); pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); merge(array, 0, size/2, size); }
Forums:
gcc -Wall
gcc -Wall
을 써서 컴파일 해 보셔요.
에러 뿐 아니라 경고도 잘 읽어 보시면 도움이 될 때가 많습니다.
세벌 https://sebuls.blogspot.kr/
gdb를 이용해 이런 오류가 있다는것을 얻었는데 어떤문제인가요??
쓰레드 함수 매개변수
확인해 보세요.
size를 넘기지 않네요
segmentation fault 문제는 원인이 매우
segmentation fault 문제는 원인이 매우 다양해서 해결하기 쉽지 않습니다. 영역 겹쳐쓰기 같은 원인은 차라리 쉬운 측에 속하죠.
위의 로그에서 볼수 있는 한가지 힌트는 missing separate debuginfos라는 것을 볼때 x86_64 머신에서 i386 디버그 모드로 프로그래밍을 하고 계시지 않은가 싶네요.
혹시 모르니 sudo apt install libc6-dbg:i386 을 실행(설치)해 보시고 다시 시도해 보세요.
redhat/fedora 계열인 것 같으니 gdb 가
redhat/fedora 계열인 것 같으니 gdb 가 알려준 명령으로 패키지 설치를 하면 backtrace 는 더 보기 쉽게 출력될 것이고요.
redhat/fedora 에서 각 패키지들의 debug 리소스를 담고 있는 패키지들은 repo 가 분리되어 있고 기본적으로 패키지 매니저에서 비활성화 되어 있습니다.
debuginfo-install 커맨드를 제공하는 이유이고, 이걸 사람들이 잘 모르니 gdb 에 저런 안내 메시지까지 출력하게 한 것이고요.
(디버깅용 툴들 뿐만 아니라 프로파일링 툴들이나 coredump 모니터링 툴 같은 것들도 debug resource 패키지들이 설치되어 있다면 잘 참조해서 출력 메시지나 로그 메시지가 보기 쉽게 기록됩니다.)
다만 단점이 하나 있는데, 여느 패키지마냥 의존 관계를 그대로 이어받기 때문에, 꼴같잖은 어플이라 할 지라도 debug 패키지를 저 명령으로 설치하면 glibc debug 패키지까지 줄줄이 다 설치됩니다.
C 소스에 헤더 파일에 디버그 정보가 포함된 바이너리(라이브러리,실행파일 모두)까지 다 설치되는터라 용량이 어마어마하죠.
--downloadonly 옵션으로 필요한 rpm (들)만 다운로드해서 의존성 무시하고 수동 설치하곤 합니다.
그런데, 이분에겐 gdb 보다는 valgrind 가 더 도움이 될 것 같네요. invalid read/write 경고가 나오는 곳들을 보면 되겠습니다.
해결했습니다. 감사합니다.
스레드의 과도한 생성이 문제가 되었네요. 레벨정해서 해결했습니다 감사합니다.
댓글 달기