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

Mar*_*rko 5 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
Run Code Online (Sandbox Code Playgroud)

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

4       breakpoint     keep y   0x00007ffff7bd92e0 in execvp at execHook.c:128
Run Code Online (Sandbox Code Playgroud)

但 gdb 永远不会在我预加载的 exec..() 函数处中断。在执行期间观察调试输出,我看到正在调用我的库函数。

Mar*_*rko 3

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

set follow-fork-mode child
Run Code Online (Sandbox Code Playgroud)

使 gdb 附加到在vfork().