使用LD_PROFILE分析预加载的共享库

use*_*435 5 linux ld sprof

我目前正在尝试使用LD_PROFILE环境变量来分析预加载的共享库.

我使用"-g"标志编译库并导出LD_PROFILE_OUTPUT以及LD_PROFILE,然后运行带有预加载库的应用程序(在我的情况下为ncat).所以,更准确地说,我做的是以下内容:

  1. 使用"-g"标志编译共享库libexample.so.
  2. export LD_PROFILE_OUTPUT=`pwd`
  3. export LD_PROFILE=libexample.so
  4. LD_PRELOAD=`pwd`/libexample.so ncat ...

预加载本身确实有效,我的库也被使用,但是没有创建libexample.so.profile文件.如果我使用export LD_PROFILE=libc.so.6,则按预期存在libc.so.6.profile文件.

这是组合LD_PRELOAD和LD_PROFILE的问题还是我可能做错了什么?

如果有任何相关性,我在CentOS 6.4上使用glibc v2.12.

非常感谢!

Hen*_*ist 1

抱歉,我不知道为什么 LD_PROFILE 不能与 LD_PRELOAD 一起使用。

然而,为了分析使用 -g 编译的二进制文件,我非常喜欢工具 valgrind 和图形工具 kcachegrind。

valgrind --tool=callgrind /path/to/some/binary 带有选项

将创建一个名为 callgrind.out.1234 的文件,其中 1234 是程序运行时的 pid。可以使用以下方法分析该文件:

kcachegrind callgrind.out.1234

在 kcachegrind 中,您可以轻松地看到哪些函数花费了最多的 CPU 时间,被调用者映射也以良好的图形方式显示了这一点。调用图可能有助于理解程序的工作原理。您甚至可以查看源代码以了解每行花费了多少 CPU 时间。

我希望您会发现 valgrind 很有用,即使这不是您 LD_PROFILE 问题的答案。valgrind 的缺点是,当 valgrind 用于分析和内存检查时,它会减慢速度。