7

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

在使用预加载的库运行应用程序(在我的情况下为 ncat)之前,我使用“-g”标志编译库并导出 LD_PROFILE_OUTPUT 和 LD_PROFILE。因此,更准确地说,我所做的是以下内容:

  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。

非常感谢!

4

1 回答 1

1

抱歉,我不知道为什么 LD_PROFILE 不适用于 LD_PRELOAD。

但是,对于使用 -g 编译的二进制文件的分析,我真的很喜欢工具 valgrind 和图形工具 kcachegrind。

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

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

kcachegrind 调用grind.out.1234

在 kcachegrind 中,您将很容易看到 CPU 时间花费最多的函数,被调用者映射也以漂亮的图形方式显示了这一点。调用图可能有助于理解程序是如何工作的。您甚至可以查看源代码以了解每行花费了多少 CPU 时间。

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

于 2014-10-26T11:37:27.520 回答