Профилирование предварительно загруженной общей библиотеки с помощью LD_PROFILE

В настоящее время я пытаюсь профилировать предварительно загруженную общую библиотеку с помощью переменной среды LD_PROFILE.

Я компилирую библиотеку с флагом "-g" и экспортирую LD_PROFILE_OUTPUT, а также LD_PROFILE перед запуском приложения (в моем случае ncat) с предварительно загруженной библиотекой. Итак, более точно, что я делаю, это следующее:

  1. Скомпилируйте разделяемую библиотеку libexample.so с флагом "-g".
  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 или я что-то сделал не так?

Я использую glibc v2.12 на CentOS 6.4, если это имеет какое-либо значение.

Большое спасибо!

2 ответа

Извините, я не знаю ответа, почему LD_PROFILE не работает с LD_PRELOAD.

Однако для профилирования двоичных файлов, скомпилированных с -g, мне очень нравится инструмент valgrind вместе с инструментом grapichal kcachegrind.

valgrind --tool = callgrind / path / to / some / binary с опциями

создаст файл с именем что-то вроде callgrind.out.1234, где 1234 был pid программы при запуске. Этот файл можно проанализировать с помощью:

kcachegrind callgrind.out.1234

В kcachegrind вы легко увидите, в какие функции расходуется наибольшее количество процессорного времени, карта вызовов также показывает это в графической форме. График вызовов может помочь понять, как работает программа. Вы даже сможете посмотреть исходный код, чтобы увидеть, сколько процессорного времени затрачивается на каждую строку.

Я надеюсь, что вы найдете Valgrind полезным, хотя это не был ответ на ваш вопрос LD_PROFILE. Недостаток valgrind заключается в том, что он замедляет работу, когда valgrind используется для профилирования и проверки памяти.

Ваша библиотека должна иметь 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
Другие вопросы по тегам