2011-09-30 51 views
3

我調試一個程序,它重複使用fork()典型的程序,其中子進程做一些委託任務作爲父稱waitpid()等待孩子完成,然後繼續。例如: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內部程序和調試接收信號,無論有多少其他的子進程順利完成,前消失了一個子進程。

當然,我需要set follow-fork-mode child,否則GDB不會查看子進程。但僅此一項就會分離父母,將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);