gpt4 book ai didi

process - GDB:在多次 fork() 之后调试子进程

转载 作者:行者123 更新时间:2023-12-02 15:54:21 25 4
gpt4 key购买 nike

我正在调试一个程序,该程序重复使用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 个 child 是接收到信号并且我想要查看的 child ,我需要重复此过程 999 次。

所以我想知道是否有一种方法可以自动执行此操作并让 GDB 遵循 CPU 将执行的操作,例如父→子1→父→子2→…,不停止也不提示我,并在第一个收到信号的childN处停止。

最佳答案

如果您要调试的信号是 SIGSEGV(或导致程序核心转储的其他信号之一),最简单的解决方案可能是让子进程转储核心,并进行事后调试。

否则,您可能想要捕获该信号,并按照 child 23435 catched signal 2; 的行打印一条消息;执行 gdb/proc/23435 23435 然后挂起子进程,例如

while(1) sleep(1);

关于process - GDB:在多次 fork() 之后调试子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com