Профиль общего объекта без перекомпиляции основной программы
В настоящее время я разрабатываю общую библиотеку для загрузки в PostgreSQL (функции C-Language см. Здесь). Теперь я хотел бы профилировать функцию в этой библиотеке без перекомпиляции самого PostgreSQL.
Я пробовал callgrind используя
valgrind --tool=callgrind path/to/postgres arguments-to-postgres
Это дает мне информацию о профилировании для самого PostgreSQL, но не может войти в общую библиотеку, в которой я заинтересован.
Я тоже пробовал sprof
, но я понятия не имею, как заставить это работать.
Любые идеи будут высоко оценены.
PS: Пожалуйста, не предлагайте просто приостановить приложение в отладчике. При времени выполнения функции менее 0,01 секунды мне нужны более подробные результаты.
2 ответа
Использование callgrind должно работать как положено. Чтобы проверить это, я настроил простой проект, используя простую библиотеку и основную функцию Makefile:
CFLAGS=-fpic
exe:exe.o lib.so
cc -o exe exe.o lib.so
lib.so:lib.o
cc -shared lib.o -o lib.so
clean:
rm -f exe lib.so *.o
lib.c - это простая библиотека, содержащая 2 функции:
#include <stdio.h>
void someOtherFunction() { printf("someOtherFunction\n"); }
void someFunction() { printf("someFunction\n"); someOtherFunction(); }
exe.c - очень простой исполняемый файл:
int someFunction();
void main() { someFunction(); }
Используйте Makefile для сборки исполняемого файла и запускайте его, используя valgrind, вот так:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD valgrind --tool=callgrind ./exe
Если вы изучите вывод callgrind, вы найдете данные профилирования для обеих функций в общей библиотеке. Если вы не видите эти функции, возможно, вы используете нестандартную среду, которая не поддерживает эту функцию. Я использую Linux Mint 11 x64, с последними патчами.
Пункт 1: Кажется, у Valgrind есть проблемы с повышением привилегий, что ОЧЕНЬ вероятно будет выполнено Postgres, см. http://www.mail-archive.com/valgrind-users@lists.sourceforge.net/msg02355.html
Пункт 2: Вы пытались доказать (например, с помощью strace), что ваш SL фактически загружен в том же процессе? Вы пытались --trace-children=yes?
Точка 3: я пытался изменить тест, скомпилировав exe.o и exe с -g0 и используя dlopen для загрузки файла, то есть:
все: exe lib.so exe: exe.c cc -g0 -o exe exe.c -ldl lib.so:lib.c cc -shared lib.c -o lib.so чистить: rm -f exe lib.so *.o
а также
#включают #включают пустая функция() { пустота * ручка; void (*p)(); Int I; handle = dlopen("./lib.so", RTLD_LAZY); if (! handle) { printf("Объект не найден \n"); вернуть; } p = dlsym(дескриптор "someFunction"); if (! p) { printf("Функция не найдена \n"); вернуть; } для (i = 0; i < 100; ++i) (*p)(); dlclose(ручка); }
Работает с callgrind. Может быть, Postgres не использует -ldl для открытия объектных файлов?