【问题标题】:monitor linux dynamic library监控linux动态库
【发布时间】:2012-07-02 08:36:20
【问题描述】:

我想监控(调试)一个用 C 语言编写的 linux 动态库。
我想看看何时以及将哪些参数传递给它。

监控“X”的库被另一个动态库“Y”调用。
“X”和“Y”都出现在可执行文件“A”的 /proc/pid/maps 中。

使用 ltrace,在可执行文件上没有显示 lib X 或 Y。
可执行文件正在使用多个线程。

另外,当在 exec 上使用 ldd 命令时,它没有提及任何关于库 X 或 Y 的内容。
ldd Y,表示Y需要X。

在所有库上使用 ldd,项目中的执行人员没有提及需要 Y 的任何人。
然而 Y 似乎已加载到 exec 的 /proc/pid/maps 中。

我不确定我可以采取哪些步骤来调试 X 库,不胜感激。

【问题讨论】:

  • Y 可能在运行时通过dlopen 加载。
  • strace 应该检测库文件加载。
  • @KerrekSB 我看到 ltrace 文档声明 Calls to dlopen()ed libraries will not be traced.
  • straceltrace 不同。您还可以使用 gdb 并在间接加载的库 X 的适当函数名称上放置断点
  • LD_PRELOAD 诡计有用吗?

标签: gdb dynamic-linking ldd ltrace gdbinit


【解决方案1】:

如果 user756235 可以在 gdb 下运行它,那么这是一种使用 thisthis 的方法。唯一的问题是在共享库 X 中列出完整的函数列表:nm ./libX.so | grep "T "

然后创建 .gdbinit(在我的例子中,我控制 print_in_lib 的 args):

host: srv2-x64rh5-01, OS: Linux 2.6.18-238.el5>more .gdbinit
file main
set pagination off
set logging file gdb.txt
set breakpoint pending on
set logging on
b print_in_lib
commands
info args
continue
end
r
set logging off
quit

当我运行gdb:

主机:srv2-x64rh5-01,操作系统:Linux 2.6.18-238.el5>gdb -q 功能 “print_in_lib”未定义。断点 1 (print_in_lib) 挂起。 警告:在添加的符号文件中找不到可加载的部分 系统提供的 DSO 在 0x2aaaaaaab000 千:1 print_debug:0

断点 1,print_in_lib (print_debug=0, index=0) 在 my_lib.cpp:7 7 if (print_debug) { print_debug = 0 index = 0

断点 1,print_in_lib (print_debug=0, index=1) 在 my_lib.cpp:7 7 if (print_debug) { print_debug = 0 index = 1

断点 1,print_in_lib (print_debug=0, index=2) 在 my_lib.cpp:7 7 if (print_debug) { print_debug = 0 index = 2

断点 1,print_in_lib (print_debug=0, index=3) 在 my_lib.cpp:7 7 if (print_debug) { print_debug = 0 index = 3

【讨论】:

  • 感谢您的精彩帖子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多