【问题标题】:How to debug functions in a dynamic library loaded with LD_PRELOAD with gdb?如何使用 gdb 调试加载了 LD_PRELOAD 的动态库中的函数?
【发布时间】:2012-03-02 10:33:44
【问题描述】:

我正在尝试调试动态共享库 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..() 函数中中断。在执行期间观察调试输出,我看到我的库函数正在被调用。

【问题讨论】:

  • 您是否尝试过在启动 gdb 之前设置 LD_PRELOAD?
  • 我之前没有尝试过,但它没有任何区别。

标签: c debugging gdb ld-preload


【解决方案1】:

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

【讨论】:

  • 完全相同:我看到断点:4 breakpoint keep y 0x00007ffff7bd92e0 in execvp at execHook.c:128,程序的调试输出显示它正在使用函数,但断点从未触发。
【解决方案2】:

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

set follow-fork-mode child

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

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多