Профиль общего объекта без перекомпиляции основной программы

В настоящее время я разрабатываю общую библиотеку для загрузки в 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 для открытия объектных файлов?

Другие вопросы по тегам