2012-01-18 39 views
2

我嘗試瞭如何從編程Ruby書中嵌入Ruby解釋器的例子。但它仍然不起作用。我已經使用RVM安裝了Ruby。在C中嵌入一個Ruby解釋器,SIGSEGV

我的源文件:https://gist.github.com/1635374

的Ruby版本:

紅寶石頭文件的
$ ruby -v 
    ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux] 

地點:

Ruby庫的
$ locate ruby.h 
    ... 
    /home/matej/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/ruby.h 
    /home/matej/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/ruby.h 
    ... 

地點:

$ locate libruby.so.1 
    /home/matej/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9 
    /home/matej/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9.1 

品牌:

$ make 
    cc -I/home/matej/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/ -I/home/matej/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/i686-linux/ -g -c -o embed2.o embed2.c 
    cc -o embed2 embed2.o -shared -L/home/matej/.rvm/rubies/ruby-1.9.2-p290/lib -ldl -lruby1.9 

運行程序:

$./embed2 

導致SIGSEGV。

你能幫我找一下,問題在哪裏?提前致謝。

+3

你有沒有試過gdb來找出它實際崩潰的地方? – hopia 2012-01-18 21:02:16

回答

3

嘗試使用其他調試符號進行編譯(例如,使用GCC/GDB的-ggdb)並在調試器中運行程序以查看導致分段錯誤的原因。

+0

這是個好主意。 '(gdb)文件embed2 讀取/home/matej/Programming/Ruby/ruby_ext_example/embed2...done中的符號。 (gdb)運行 啓動程序:/ home/matej/Programming/Ruby/ruby​​_ext_example/embed2 程序接收到的信號SIGSEGV,Segmentation fault。 0x00000001在?? () '好吧,但我沒有更聰明的這個... – matejuh 2012-01-18 21:33:45

+0

@matejuh:你在哪裏設置了一個斷點?該工具不會自動解決您的問題,您需要考慮它以及如何有效地使用它。 – maerics 2012-01-18 22:52:28

+0

我知道,我很抱歉。我之前從未使用gdb ...在我以前的項目中,我使用了Valgrind ... – matejuh 2012-01-18 22:56:46

0

我已經在花費2小時後發現問題了。 -shared參數由於某種原因造成的。在本書的例子中沒有這個參數,我添加它是因爲我以前的libruby加載問題。它可以在由extconf生成的makefile中找到。