我調試一個程序,它重複使用的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.
您可以使用GDB宏編寫一些腳本。或者,更改您的代碼,以便第1000個(或其他)子將轉儲核心,然後調試核心? –