У меня есть программа, написанная на Ruby и C. Часть C представляет собой общую библиотеку, которая является расширением для программы Ruby. Я хочу профилировать общую библиотеку C, которую я написал, используя gprof. Я компилирую разделяемую библиотеку так:
gcc -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -march=i686 -O2 -ggdb -pg -fPIC -c extension.c
gcc -shared -o extension.so extension.o -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic -lruby1.8 -lpthread -lrt -ldl -lcrypt -lm -lc
Затем я запускаю программу ruby, которая загружает эту общую библиотеку, и я ожидаю файл gmon.out в текущем каталоге, но по какой-то причине файл gmon.out не создается. Как мне это сделать?
Я гуглил по этому поводу, но не смог найти удовлетворительного ответа (что сработало).
P.S. - В качестве обходного пути у меня может быть измененная версия расширения, которая является чистой программой на C (вместо того, чтобы быть созданной в качестве общей библиотеки), которую я могу использовать для профилирования, но становится утомительно поддерживать две версии одного и того же расширения C ( большое количество различий между ними).
Я пытался написать программу на C, которая тоже напрямую использует разделяемую библиотеку. Я немедленно получаю ошибку страницы в одной из функций библиотеки ruby, которые вызываются во время инициализации разделяемой библиотеки. Я думаю, что он действительно должен быть загружен из программы ruby, которая, возможно, внутренне творит магию.
(gdb) bt
#0 0x0091556e in st_lookup () from /usr/lib/libruby1.8.so.1.8
#1 0x008e87c2 in rb_intern () from /usr/lib/libruby1.8.so.1.8
#2 0x008984a5 in rb_define_module () from /usr/lib/libruby1.8.so.1.8
#3 0x08048dd0 in Init_SimilarStr () at extension.c:542
#4 0x0804933e in main (argc=2, argv=0xbffff454) at extension.c:564
Обновление: Не бери в голову. Я использовал #ifdef для компиляции частей расширения на Ruby и получения профиля. Закрытие.