分叉进程中的共享库调试

时间:2010-02-11 00:50:43

标签: debugging gdb fork

如何在这种情况下调试共享库:

守护程序正在检查哪个作业设置为运行,如果找到一个,守护程序将分叉进程。这个过程将使用dlopen / dlsym等来使用共享库。

共享库在我的控制之下,所以我可以把一个包含调试信息。虽然守护程序不在我的控制之下,但由于某种原因无法停止。守护进程中没有可用的调试信息。

以下是我的调试方式: 启动gdb,附加到守护进程,将follow-fork-mode设置为“child”,使用共享库的入口点设置断点。

但它不起作用。调试会话没有在我设置的断点处中断。 我使用gdb 6.1.1。 感谢。

2 个答案:

答案 0 :(得分:2)

您可以在此处输入临时变量,然后是无限循环:

void my_shared_loopy()
{
  int loopy = 1;
  while (loopy) ;
}

在您尝试调试的函数中的某处调用my_shared_loopy() ...重新编译您的共享库,然后当调试器连接到您正在调试的函数时,它将挂起此代码...将loopy的值设置为0,然后继续进行调试。

编辑:作为一个额外的助手,我通常会把

fprintf(stderr, "attach GDB to %d\n", getpid());
在循环之前

。此外,如果您不想意外地刻录很多周期,请让循环像这样睡觉:

void my_shared_loopy()
{
  int loopy = 1;
  fprintf(stderr, "attach GDB to %d\n", getpid());
  while (loopy) sleep(1);
}

当您附加GDB时,您很可能会在睡眠中。这样做是为了离开:

(gdb) finish
(gdb) set var loopy = 0
(gdb) break <wherever you want to debug>
(gdb) continue

答案 1 :(得分:0)

我不知道这是否有帮助,但在Windows中,当我遇到这样的问题时,我只是在一些早期调用的方法中将以下代码插入到我的dll中。

static bool breakHere = true;
if (breakHere) _asm {int 3}

int 3是x86 CPU的硬件中断指令

然后加载我的dll并且此代码被命中。 Windows显示“你想调试你的应用程序”对话框,我说是的。一旦我运行调试器,我将breakHere更改为true并继续。