2012-05-24 6 views
3

Solaris 10에서 프로그램을 개발합니다. 충돌시 스택 추적을 인쇄하고 싶습니다.pthread : SIGSEGV 처리기가 실행되는 동안 다른 스레드가 멈 춥니 다?

static void pstack() 
{ 
    char buf[256]; 

    sprintf(buf, "/usr/proc/bin/pstack %d |/bin/tee traceback.txt\n", (int)getpid()); 
    /* undefine LD_PRELOAD to avoid 64-bit problems */ 
    (void)putenv("LD_PRELOAD="); 
    system(buf); 
} 
void sighanterm(int signo, siginfo_t *info, void *context) { 
    ... 
    pstack(); 
} 

흥미로운 점은 다음과 같습니다 :이 예를 발견 /usr/proc/bin/pstack 실행하는 동안 다른 스레드가 너무 자신의 출력을 인쇄 유지한다. system()이 호출되거나 스레드가 전혀 중단되지 않으면 스레드가 재개됩니까? 핸들러에서 명시 적으로 중지 할 수 있습니까?

+0

글쎄, 나는 이것을 백업 할 것이 없다. 그러나 기본 처리기가 그들을 죽인다는 것을 상상할 수있다.하지만 당신이 처리 할 때까지 일시 중지하거나 죽이지는 않는다. 당신 자신. – Kevin

답변

2

아니요, 처리 된 SIGSEGV은 다른 스레드에 영향을주지는 않지만 (메모리 손상이나 다른 UB로 인한 경우에도 UB가 물론 다른 스레드에 영향을 줄 수는 있지만). 한편 처리되지 않은 SIGSEGV은 전체 프로세스를 종료합니다.

관련 문제