2011-08-29 4 views
1

저는 c로 작성된 작은 도구를 작성 중이며 현재 해결 방법을 모르는 분할 오류를 만났습니다.strlen_sse4.S가 누락되면 세그먼트 화 오류가 발생합니다.

 

    Program received signal SIGSEGV, Segmentation fault. 
    __strlen_sse42() at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32 
    ../sysdeps/x86_64/multiarch/strlen-sse4.S: File or Directory not found 
    in ../sysdeps/x86_64/multiarch/strlen-sse4.S 
    (gdb) bt 
    0 __strlen_sse42() at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32 
    1 0x00007ffff764fed8 in strdup_and_subst_obj() from /usr/lib/libgvc.so.5 
    2 0x00007ffff7650631 in make_label() from /usr/lib/libgvc.so.5 
    3 0x00007ffff765a6d1 in common_init_node_opt() from /usr/lib/libgvc.so.5 
    4 0x00007ffff309d700 in dot_init_node_edge() from 
    usr/lib/graphviz/libgvplugin_dot_layout.so.6 
    5 0x00007ffff309dcd8 in dot_layout() from /usr/lib/graphviz/libgvplugin_dot_layout.so.6 
    6 0x00007ffff7633a94 in gvLayoutJobs() from /usr/lib/libgvc.so.5 
    7 0x00007ffff7639425 in gvLayout() from /usr/lib/libgvc.so.5 
    8 0x0000000000400eef in main() 

내가 말할 것이다 : GDB에서 실행하는 나에게 다음과 같은 힌트를 준다 난 내 시스템이나 내 실행 파일의 특정 종속성 누락 (우분투 11.04 64 비트) 어떤 조언을 매우 감사하게 될 것이다 :]

내가 현재 사용하고 있습니다

GCC를 (우분투/리나 4.5.2-8ubuntu4) 4.5.2

편집 :

 
(gdb) info registers 

    rax   0x6380e0 6521056 
    rbx   0x62dc14 6478868 
    rcx   0x0 0 
    rdx   0x0 0 
    rsi   0x639770 6526832 
    rdi   0x0 0 
    rbp   0x639770 0x639770 
    rsp   0x7fffffffd358 0x7fffffffd358 
    r8    0x0 0 
    r9    0x0 0 
    r10   0x7fffffffd140 140737488343360 
    r11   0x7ffff764fda0 140737343978912 
    r12   0x62dc14 6478868 
    r13   0x639770 6526832 
    r14   0x0 0 
    r15   0x7ffff7671d85 140737344118149 
    rip   0x7ffff6d7d49f 0x7ffff6d7d49f 
    eflags   0x10246 [ PF ZF IF RF ] 
    cs    0x33 51 
    ss    0x2b 43 
    ds    0x0 0 
    es    0x0 0 
    fs    0x0 0 
    gs    0x0 0 
+1

추측하기 : 하드웨어가 프로그램에서 사용하는 것으로 보이는 SSE4를 지원하지 않습니다. 당신이 편집 한 줄을 줄 수 있습니까? – Nobody

+0

수 있습니다. 어쩌면 라이브러리 (libgraphviz) 관련 문제도 있습니다. 왜냐하면 내 프로그램에서 sse4 또는 다른 SIMD parallization에 대한 API를 명시 적으로 호출하지 않았기 때문입니다. 표준 우분투 저장소에 의해 관리되는 libgraphviz의 현재 버전은이 지침에 따라 최적화되는 것으로 보입니다. 그러나 나는 내부 조직 방법을 모른다. – Ruun

+1

glibc-2.14의 strlen-sse4.S에있는 FWIW 행 32는'SSM2 명령 인'pcmpeqb (% rdi), % xmm1'입니다. OTOH는 문자열에 액세스하는 함수의 첫 번째 위치입니다. 충돌 사이트에서 레지스터를 덤프하여 포스트 ('info registers')에 첨부 할 수 있습니까? – user786653

답변

2

세그먼트 오류는 일반적으로 널 포인터 참조 해제입니다. libc가 꽤 견고하다는 점을 감안할 때 디버그 기호로 프로그램을 다시 컴파일하고 libgvc에 대한 Ubuntu 패키지의 디버그 변형을 얻으려고합니다.

"Missing strlen_sse4.S"는 충돌 사이트 목록을 제공하는 파일을 찾을 수 없다는 불만을 표시하는 디버거입니다. 파일을 검사하려면 glibc 소스 복사본 만 있으면됩니다.

+0

아, 알겠습니다. 문제의 자세한 내용을 알기 위해 디버그 기호가 누락되었다고 불만을 토로합니다. 좋아, 내가이 힌트를 따라갈거야. – Ruun

+0

나는 이제 내 문제를 발견했고 정확히 그랬다. 아마 내 라이브러리의 주어진 API를 사용하지 않았고 널 포인터 참조 해제가 발생했습니다. 이전에 언급 한 Boost로 인한 언급 된 문제는 완전히 다른 문제입니다. 왜냐하면 동일한 기능으로 더 간단한 프로그램에서 실행되기 때문입니다. – Ruun

관련 문제