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

时间:2014-01-17 21:35:17

标签: 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 ...
  5. 预加载本身可以正常工作并使用我的库,但是没有创建libexample.so.profile文件。如果我改为使用export LD_PROFILE=libc.so.6,则会有一个文件libc.so.6.profile。

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

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

    非常感谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

kcachegrind callgrind.out.1234

在kcachegrind中,您将很容易地看到大多数CPU时间用于哪些函数,被调用者映射也以非图形方式显示。调用图可能有助于理解程序的工作原理。您甚至可以查看源代码,了解每行占用多少CPU时间。

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