Debugging 分叉进程中的共享库调试

Debugging 分叉进程中的共享库调试,debugging,gdb,fork,Debugging,Gdb,Fork,在这种情况下,如何调试共享库: 守护进程正在检查哪个作业被设置为运行,如果找到一个,守护进程将分叉一个进程。此过程将执行dlopen/dlsym等以使用共享库 共享库在我的控制之下,因此我可以将其与调试信息放在一起。而守护进程不在我的控制之下,并且由于某些原因无法停止。守护进程中没有可用的调试信息 以下是我调试的方式: 启动gdb,连接到守护进程,将follow fork mode设置为“child”,将断点设置为共享库的入口点 但它不起作用。调试会话根本没有在我设置的断点处中断。 我使用GDB

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

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

共享库在我的控制之下,因此我可以将其与调试信息放在一起。而守护进程不在我的控制之下,并且由于某些原因无法停止。守护进程中没有可用的调试信息

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

但它不起作用。调试会话根本没有在我设置的断点处中断。 我使用GDB6.1.1。
谢谢。

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

static bool breakHere = true;
if (breakHere) _asm {int 3}
int 3
是x86 CPU的硬件中断指令


然后当我的dll被加载,这段代码被命中。Windows打开“是否要调试应用程序”对话框,我说“是”。一旦调试器运行,我将
breakHere
更改为true并执行

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

void my_shared_loopy() { int loopy = 1; while (loopy) ; } 在循环之前。此外,如果您不想意外地燃烧大量循环,请按如下方式使循环休眠:

void my_shared_loopy() { int loopy = 1; fprintf(stderr, "attach GDB to %d\n", getpid()); while (loopy) sleep(1); } 作废我的共享 { int-loopy=1; fprintf(stderr,“将GDB连接到%d\n”,getpid()); 而(循环)睡眠(1); } 当您连接GDB时,您很可能处于睡眠状态。这样做是为了出去:

(gdb) finish
(gdb) set var loopy = 0
(gdb) break <wherever you want to debug>
(gdb) continue
(gdb)完成
(gdb)设置变量loopy=0
(gdb)中断
(gdb)继续

问题没有说明操作系统和处理器;“int3”(或UNIX汇编器拼写的“int3”)假设这是在Intel x86上,但我们不知道。此外,当进程未在调试器下执行时,此方法将使进程崩溃并烧掉。@Employed Russian-感谢您的小编辑!:)
(gdb) finish
(gdb) set var loopy = 0
(gdb) break <wherever you want to debug>
(gdb) continue