У меня есть программа, написанная на 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, которая вызывается во время инициализации общей библиотеки. Я думаю, что он действительно ожидает загрузки из рубиновой программы, которая может внутренне творить магию.
(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-частей расширения и получения профиля. Закрытие.
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 -pg
- person dashesy   schedule 15.05.2012