Профиль общего объекта без перекомпиляции основной программы - PullRequest
5 голосов
/ 25 июля 2011

В настоящее время я разрабатываю общую библиотеку для загрузки в PostgreSQL (функции C-Language см. здесь ).Теперь я хотел бы профилировать функцию в этой библиотеке без перекомпиляции самого PostgreSQL.

Я пытался использовать callgrind, используя

valgrind --tool=callgrind path/to/postgres arguments-to-postgres

. Это дает мне информацию о профилировании для самого PostgreSQL, но не может войти в общий ресурс.Библиотека, в которой я заинтересован.

Я также попробовал sprof, но я не знаю, как заставить это работать.

Любые идеи будут очень ценными.

PS: Пожалуйста, не предлагайте просто приостановить приложение в отладчике.При времени выполнения функции ниже 0,01 секунды мне нужны более подробные результаты.

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Использование 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 голос
/ 29 июля 2011

Пункт 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 для загрузки файла, то есть:

all: exe lib.so
exe : exe.c 
        cc -g0 -o exe exe.c -ldl

lib.so:lib.c
        cc -shared lib.c -o lib.so
clean:
        rm -f exe lib.so *.o

и

#include 
#include 

void main() { 
    void *handle;
    void (*p)();
    int i;

    handle = dlopen("./lib.so", RTLD_LAZY);
    if ( ! handle ) { printf("Object not found\n"); return; }
    p = dlsym(handle, "someFunction");
    if ( ! p ) { printf("Function not found\n"); return; }
    for (i = 0; i < 100; ++i) (*p)();
    dlclose(handle);
}

Работает с callgrind.Может быть, Postgres не использует -ldl для открытия объектных файлов?

...