【问题标题】:Profiling a preloaded shared library with LD_PROFILE使用 LD_PROFILE 分析预加载的共享库
【发布时间】:2014-02-07 09:35:52
【问题描述】:

我目前正在尝试使用 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。

非常感谢!

【问题讨论】:

  • 7 年后我遇到了同样的问题。我想知道是否应该指定版本号。

标签: linux ld sprof


【解决方案1】:

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

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

valgrind --tool=callgrind /path/to/some/binary with options

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

kcachegrind 调用grind.out.1234

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多