세그먼테이션 폴트 원인을 못찾겠습니다

basic0968의 이미지


아래 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);
}
세벌의 이미지

gcc -Wall
을 써서 컴파일 해 보셔요.
에러 뿐 아니라 경고도 잘 읽어 보시면 도움이 될 때가 많습니다.

basic0968의 이미지

[New Thread 0x7fffe6cf6700 (LWP 1758)]
[New Thread 0x7fffe5cf4700 (LWP 1760)]
[New Thread 0x7fffe64f5700 (LWP 1759)]
[New Thread 0x7fffe54f3700 (LWP 1762)]
[New Thread 0x7fffe4cf2700 (LWP 1763)]
[New Thread 0x7fffdeffd700 (LWP 1764)]
[New Thread 0x7fffdffff700 (LWP 1765)]
[New Thread 0x7fffdf7fe700 (LWP 1766)]
[New Thread 0x7fffde7fc700 (LWP 1767)]
[New Thread 0x7fffdd7fa700 (LWP 1769)]
[New Thread 0x7fffddffb700 (LWP 1768)]
[New Thread 0x7fffdcff9700 (LWP 1770)]
[New Thread 0x7fffd27fc700 (LWP 1772)]
[New Thread 0x7fffd37fe700 (LWP 1771)]
[New Thread 0x7fffd3fff700 (LWP 1773)]
[New Thread 0x7fffd2ffd700 (LWP 1774)]
[New Thread 0x7fffd0ff9700 (LWP 1775)]
[New Thread 0x7fffd1ffb700 (LWP 1778)]
[New Thread 0x7fffabfff700 (LWP 1776)]
[New Thread 0x7fffbbfff700 (LWP 1779)]
[New Thread 0x7fffd17fa700 (LWP 1777)]
[New Thread 0x7fffb9ffb700 (LWP 1781)]
[New Thread 0x7fffbaffd700 (LWP 1780)]
[New Thread 0x7fffb8ff9700 (LWP 1783)]
[New Thread 0x7fffba7fc700 (LWP 1782)]
[New Thread 0x7fffbb7fe700 (LWP 1784)]
[New Thread 0x7fffaaffd700 (LWP 1785)]
[Thread 0x7fffabfff700 (LWP 1776) exited]
[Thread 0x7fffba7fc700 (LWP 1782) exited]
[Thread 0x7fffb9ffb700 (LWP 1781) exited]
[Thread 0x7fffd0ff9700 (LWP 1775) exited]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffb8ff9700 (LWP 1783)]
0x00007ffff7bc6e6a in __deallocate_stack () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.5.x86_64
noname1의 이미지

확인해 보세요.
size를 넘기지 않네요

라스코니의 이미지

segmentation fault 문제는 원인이 매우 다양해서 해결하기 쉽지 않습니다. 영역 겹쳐쓰기 같은 원인은 차라리 쉬운 측에 속하죠.

위의 로그에서 볼수 있는 한가지 힌트는 missing separate debuginfos라는 것을 볼때 x86_64 머신에서 i386 디버그 모드로 프로그래밍을 하고 계시지 않은가 싶네요.

혹시 모르니 sudo apt install libc6-dbg:i386 을 실행(설치)해 보시고 다시 시도해 보세요.

bushi의 이미지

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 경고가 나오는 곳들을 보면 되겠습니다.

basic0968의 이미지

스레드의 과도한 생성이 문제가 되었네요. 레벨정해서 해결했습니다 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.