如何在使用带有gdb的LD_PRELOAD加载的动态库中调试函数?

时间:2012-02-09 22:11:39

标签: c debugging gdb ld-preload

我正在尝试调试动态共享库libexecHook.so中的一些函数。这个库预先加载设置LD_PRELOAD,以拦截和重写对execve()和朋友的一些调用。出于调试目的,我使用符号构建了gmake。从我在其他问题中读到的内容可以起作用:

gdb ~/tmp/make-dfsg-3.81/make
set exec-wrapper env LD_PRELOAD=/home/marko/execHook.C027/lib/libexecHook.so.0.0.0
start
break execve
break execvp
cont

我确实看到断点设置正确,例如

4       breakpoint     keep y   0x00007ffff7bd92e0 in execvp at execHook.c:128

但gdb从未在我预加载的exec ..()函数中断。在执行期间观察调试输出我看到我的库函数正在被调用。

2 个答案:

答案 0 :(得分:2)

gdb没有在我预加载的包装器函数中断的原因是这些是从没有连接gdb的子进程执行的。在Linux上我可以

set follow-fork-mode child

使gdb附加到vfork()中创建的子项。

答案 1 :(得分:0)

在设置断点之前尝试说出start。这将开始运行程序,这将导致满足库依赖项,希望使用您的LD_PRELOAD路径。然后在启动后设置断点,然后继续。