如何在这种情况下调试共享库:
守护程序正在检查哪个作业设置为运行,如果找到一个,守护程序将分叉进程。这个过程将使用dlopen / dlsym等来使用共享库。
共享库在我的控制之下,所以我可以把一个包含调试信息。虽然守护程序不在我的控制之下,但由于某种原因无法停止。守护进程中没有可用的调试信息。
以下是我的调试方式: 启动gdb,附加到守护进程,将follow-fork-mode设置为“child”,使用共享库的入口点设置断点。
但它不起作用。调试会话没有在我设置的断点处中断。 我使用gdb 6.1.1。 感谢。
答案 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并继续。