2011-09-30 4 views
3

내가 디버깅있어 프로그램하는 반복 부모가 아이를 기다리는 waitpid()를 호출로 자식 프로세스가 일부 위임 된 작업을 수행 fork()을 사용하는 일반적인 절차 끝내고 계속한다. 예를 들어 :GDB : 많은 포크()의 후 자식 프로세스를 디버깅

while (!finished) { 
    pid_t p = fork(); 
    if (p < 0) { 
     perror("fork"); 
     exit(EXIT_FAILURE); 
    } 
    else if (p == 0) { 
     /* Do something. For example: */ 
     if (/* some (rare) condition */) 
      raise(SIGSEGV); 
     exit(EXIT_SUCCESS); 
    } 
    else { 
     int status; 
     pid_t w = waitpid(p, &status, 0); 
     if (w < 0) { 
      perror("waitpid"); 
      exit(EXIT_FAILURE); 
     } 
     /* Do something. */ 
    } 
} 

나는 GDB 내에서 프로그램을 실행 좋아하고 것입니다 얼마나 많은 다른 자식 프로세스가 성공적으로 완료 상관없이 신호, 를받지과 전에 사라진 자식 프로세스를 디버깅합니다.

물론 GDB는 자식 프로세스를 조사하지 않기 때문에 set follow-fork-mode child이 필요합니다. 그러나 이것만으로도 부모를 분리하고, GDB를 첫 번째 자식에게 인도하며, 종료시 디버깅을 마칩니다.

따라서 부모가 분리되지 않도록하려면 set detach-on-fork off도 필요합니다. 그러나, 이것은 GDB가 멈추도록하고, 첫 번째 자식이 종료 될 때 부모가 일시 중지됨과 동시에 프롬프트를 제공합니다. inferior을 사용하여 학부모를 선택하고 continue을 발행 할 수 있지만, 모든 어린이에게이 작업을 수행해야합니다.. 1000 번째 자식이 신호를 받고 내가 조사하고 싶은 자식이라면이 과정을 999 번 반복해야합니다.

그래서이 방법을 자동으로 수행하여 GDB가 CPU가 수행 할 작업을 수행하도록 할 것인지 궁금합니다. 부모 → 자식 1 → 부모 → 자식 2 → ..., 멈추지 않고 나에게 자극을주지 않고 신호를받는 첫 번째 자식 N에서 멈 춥니 다.

+0

GDB 매크로로 일부 스크립트를 작성할 수 있습니다. 또는 1000 번째 (또는 무엇이든) 자식이 코어를 덤프하고 코어를 디버깅하도록 코드를 변경하십시오. –

답변

3

디버그하려는 신호가 SIGSEGV (또는 프로그램이 코어 덤프를 유발하는 다른 신호 중 하나) 인 경우 가장 쉬운 해결책은 자식이 코어를 덤프하도록 허용하고 사후 디버깅을 수행하는 것입니다 .

그렇지 않으면 신호를 잡아 child 23435 caught signal 2; execute gdb /proc/23435 23435 줄에 따라 메시지를 인쇄 한 다음 예를 들어

while(1) sleep(1); 
관련 문제