2012-06-09 3 views
1

내 C++ 코드에 매우 이상한 버그가 있습니다.C++ 원치 않는 중단 원인?

전체를 이해하려면 이야기를해야합니다. boost_thread 라이브러리를 통해 스레드를 사용하고 있습니다. 주요 방법은 3 ~ 4 개 스레드를 시작하고, 일부 초기화를하게 영원히 대기보다 :

void do_work() { 
    try { 
    .. 
    } 
    catch (int ei) { 
    } 
    catch (...) { 
    log("General error"); 
    } 
} 

:

while(true) sleep(1); 

모든 스레드의 주요 기능은 일부 캐치 시도 및 캐치 모든 핸들러가 스레드는

  • 함께 데이터베이스에 기록, execv와 기능 스크립트를 실행

    • 같은 다양한 작업을 수행 sqlite 라이브러리,
    • 은 openssl 라이브러리를 통해 전 세계와 통신합니다.

    때때로, 보통은 아니지만 꽤 자주 짜증나는 프로그램이 종료됩니다.

    모든 것이 올바르게 해제되고 삭제되어야하므로 문제가 될 수 없습니다. 문제를 디버그 할 수있는 기회를주기 위해 코어 덤프를 생성했습니다.

    흥미로운 부분은 바로 지금 여기에 온다 : GDB의 역 추적은 다음과 같습니다

    (gdb) bt 
    #0 0x40281ae8 in raise() from /lib/libc.so.6 
    #1 0x402830ec in abort() from /lib/libc.so.6 
    #2 0x402830ec in abort() from /lib/libc.so.6 
    #3 0x402830ec in abort() from /lib/libc.so.6 
    #4 0x402830ec in abort() from /lib/libc.so.6 
    #5 0x402830ec in abort() from /lib/libc.so.6 
    #6 0x402830ec in abort() from /lib/libc.so.6 
    #7 0x402830ec in abort() from /lib/libc.so.6 
    #8 0x402830ec in abort() from /lib/libc.so.6 
    #9 0x402830ec in abort() from /lib/libc.so.6 
    

    끝없는 내가 그것을 원인이 무엇인지 전혀 모른다 호출을 중단. 스레드는 다음과 같습니다 : 스레드 1 끝없는 수면 루프를 사용하여 주요 기능이기 때문에 흥미 롭다

    (gdb) info threads 
        4 Thread 490 0x402e7bf4 in nanosleep() from /lib/libc.so.6 
        3 Thread 489 0x4031b384 in accept() from /lib/libc.so.6 
        2 Thread 501 0x402e7bf4 in nanosleep() from /lib/libc.so.6 
    * 1 Thread 486 0x40281ae8 in raise() from /lib/libc.so.6 
    

    합니다.

    내 질문 : 가 어떻게 낙태의 이유를 발견 할 수 있습니다 (내가 잘못 아니에요 만약 내가 그것을 무시할 수 없기 때문에)?

    포럼, IRC 채널 및 Google 검색에서 검색해보세요. 나는이 주 전에 막혔다. 그래서 어떤 정보라도 크게 감사하겠습니다!

    대단히 감사합니다!

    +1

    중단 점 (b abort') 맨 위에 중단 점을 고정 시키려고 했습니까? – dave

    +0

    아직, 그럴 것입니다! 고마워요 :) 이 버그가 며칠 동안 나타나지 않는 상황이 있기 때문에 조금 어려워집니다. – Daniel

    +0

    이 프로그램은 valgrind에서 실행하는 데 아주 좋은 후보자처럼 들립니다. 힙 손상이 계속 발생하면 (예 : 스레드 간의 경쟁 조건으로 인해) valgrind가 문제의 원인이 될 수 있습니다. –

    답변

    1

    SIGABRT는 일이 심각하게 잘못되었을 때 주로 전송됩니다. 스택이 잘릴 수 있기 때문에 추적하기가 어려울 수 있습니다.

    역 추적에서 스트립 된 (아마도 최적화 된) 실행 파일로 실행중인 것처럼 보입니다. -g으로 컴파일 및 링크를 시도 했으므로 코어 덤프를 얻었을 때 좀 더 통찰력을 얻을 수 있습니까?

    +0

    예, 그것은 박탈 된 것입니다, 나는 조금 더 많은 정보를 얻기 위해 심볼 등으로 지금 컴파일했습니다. 버그가 다시 올 때 여기에 새 백 트레이스를 업로드합니다. 하지만 중단 함수가 내 코드에 없기 때문에 너무 도움이되지 않을 것 같아요. backtrace는 그걸로 가득차 있습니다. ( – Daniel

    +0

    스택을 휴지통으로 의심하여 ​​그 추적을 완전히 망칠 수 있습니다. 아마도 스택 오버플로, –

    +0

    이 문제에 관한 해결책은, 필자가 정말로 필요로 했습니까? – lucifer