我有一個用Ruby和C編寫的程序.C部分是一個共享庫,它是Ruby程序的擴展。我想使用gprof來描述我編寫的C共享庫。我編譯共享庫這樣的:配置一個由Ruby程序調用的C共享庫程序
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部分並獲取配置文件。關閉。
萬一有人在尋找答案;我認爲-pg也應該傳遞給鏈接器命令;即'gcc -shared -o extension.so extension.o -L。 -L/usr/lib -L。 -W1,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic -lruby1。8 -lpthread -lrt -ldl -lcrypt -lm -lc -pg' – dashesy 2012-05-15 19:02:56
我希望你不會因爲你找到答案而關閉這個問題。這對其他人也很有用。 – 2013-09-26 14:43:23