2012-02-09 150 views
2

我想在动态共享库libexecHook.so中调试一些函数。这个库预装了LD_PRELOAD,用于拦截并重写一些对execve()和朋友的调用。出于调试目的,我已经用符号构建了gmake。从我读过的其他问题,这应该工作:如何在用gdb加载LD_PRELOAD的动态库中调试函数?

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 ..()函数。在执行期间看着调试输出,我看到我的库函数正在被调用。

+0

您是否曾尝试在启动gdb之前设置LD_PRELOAD? – 2012-02-10 15:25:19

+0

我以前没有尝试过,但没有什么区别。 – Marko 2012-02-10 17:39:31

回答

2

gdb在我预先加载的包装函数中没有中断的原因是它们是从没有连接到gdb的子进程执行的。在Linux上,我可以

set follow-fork-mode child 

使GDB附加到获取一个vfork()创建的子。

0

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

+0

完全一样的东西:我看到了断点:'exec_pc:128'处的execvp中有4个断点保存y 0x00007ffff7bd92e0,并且程序的调试输出显示它正在使用函数,但断点从不触发。 – Marko 2012-02-10 11:02:33