【发布时间】:2011-09-30 07:59:19
【问题描述】:
我正在调试一个程序,该程序重复使用fork() 的典型过程,其中子进程执行一些委派任务,因为父进程调用waitpid() 等待子进程完成,然后继续。例如:
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 将执行的操作,例如parent → child1 → parent → child2 → ... ,没有停止和提示我,并在第一个收到信号的 childN 处停止。
【问题讨论】:
-
您可以使用 GDB 宏编写其中的一些脚本。或者,更改您的代码,以便第 1000 个(或其他)孩子将转储核心,然后调试核心?