1

我是 C 编程的新手,我一直在努力根据我的组织需求定制一个用 C 编写的开源工具。

IDE:Eclipse,调试器:GDB,操作系统:RHEL

该工具本质上是多进程的(主进程第一次执行并使用 fork() 生成多个子进程)并且它们在运行时共享值。在 Eclipse 中调试(使用 GDB)时,我发现被调试的进程只在运行,而其他进程处于挂起模式。因此,唯一正在运行的进程无法完成其预期的工作,因为其他进程已挂起。

我在某处看到在 GDB 中使用 MI 命令作为“设置不间断”可以使其他进程运行。我在如下所示的 gdbinit 文件中使用了相同的命令:

调试配置

注意:我已经用另一个 gdbinit 覆盖了上面的 .gdbinit 文件,因为 .gdbinit 不允许我调试子进程,因为调试器在主进程执行后终止。

但不幸的是,调试器在使用此命令后停止响应。

请查看我在 gdbinit 文件中使用的以下命令:

gdbinit 文件内容

不间断地注释使 Eclipse 能够继续对当前进程进行常规调试。

添加:您可以在下图中看到只有一个进程正在运行,而其他进程被挂起。

在此处输入图像描述

谁能帮我根据我的要求配置GDB?

提前致谢。

4

1 回答 1

1

好的@nm:实际上,你是对的。我应该花更多的时间来理解代码的流程。该工具首先创建 3 个进程,然后第三个进程创建 5 个线程并继续等待()以使任何子线程终止。

下图中显示的前 5 个线程(以蓝色突出显示)是线程,它们是进程 ID:17991 的子进程

在此处输入图像描述

在此处输入图像描述

前两个进程旨在启动该工具的基本功能,因此它们只是等待获得 exit(0)。你可以在下面看到。

if (0 != (pid = zbx_fork()))
        exit(0);

    setsid(); 

    signal(SIGHUP, SIG_IGN);

    if (0 != (pid = zbx_fork()))
        exit(0);

这就是我实际上无法参与这三个过程的原因。每当我尝试这样做时,整个主进程都会立即终止,从而导致所有其他进程终止。所以,我了解到我应该只“步入”线程。是的,实际上我现在可以调试了:)

这可以实现,因为我必须删除 MI 命令“set follow-fork-mode child”。所以,我只是使用了默认的“.gdbinit”文件并启用了“自动调试分叉进程”。

谢谢各位的意见。Stackoverflow 是一个学习和分享的好地方。:)

于 2014-05-30T11:56:31.803 回答