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

问题描述 投票:0回答:2

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

非常感谢!

linux ld sprof
2个回答
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 用于分析和内存检查时,它会减慢速度。


0
投票

您的库应该有一个 SONAME,该 SONAME 在链接时使用

-h <SONAME>
标志指定,并且此 SONAME 应该与
LD_PROFILE

一起使用。

示例:

cc -o libexample.so libexample.o -h libexample.so.1 -shared
objdump -p libexample.so
...
...
Dynamic Section:
...
...
SONAME               libexample.so.1
...
...

然后

export LD_PROFILE_OUTPUT=$PWD
export LD_PROFILE=libexample.so.1
LD_PRELOAD=`pwd`/libexample.so ncat
© www.soinside.com 2019 - 2024. All rights reserved.