【问题标题】:GDB: debugging a child process after many fork()sGDB:在许多 fork() 之后调试子进程
【发布时间】: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 个(或其他)孩子将转储核心,然后调试核心?

标签: process gdb fork


【解决方案1】:

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

否则,您可能想要捕获信号,按照child 23435 caught signal 2; execute gdb /proc/23435 23435 的行打印一条消息,然后使用例如暂停孩子

while(1) sleep(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2018-12-13
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多