Профилирование предварительно загруженной общей библиотеки с помощью LD_PROFILE
В настоящее время я пытаюсь профилировать предварительно загруженную общую библиотеку с помощью переменной среды LD_PROFILE.
Я компилирую библиотеку с флагом "-g" и экспортирую LD_PROFILE_OUTPUT, а также LD_PROFILE перед запуском приложения (в моем случае ncat) с предварительно загруженной библиотекой. Итак, более точно, что я делаю, это следующее:
- Скомпилируйте разделяемую библиотеку libexample.so с флагом "-g".
export LD_PROFILE_OUTPUT=`pwd`
export LD_PROFILE=libexample.so
- бежать
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