2012-01-18 15 views
2

プログラミングRubyブックからRubyインタプリタを埋め込む方法の例を試しています。しかし、それはまだ動作していません。私はRubyをRVMにインストールしました。C、SIGSEGVにRubyインタプリタを埋め込む

私のソースファイル: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 
    ... 

Rubyライブラリの場所:

$ 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

答えて

3

GCC/GDBを使用している場合は、追加のデバッグシンボル(例:-ggdb)でコンパイルして、デバッガでプログラムを実行してセグメンテーションフォルトの原因を確認してください。

+0

それは良いアイデアです。 '(gdb)file embed2 /home/matej/Programming/Ruby/ruby_ext_example/embed2..doneからシンボルを読み込みます。 run 開始プログラム:/ home/matej/Programming/Ruby/ruby​​_ext_example/embed2 プログラム受信信号SIGSEGV、セグメンテーションフォルト。 ??インチの0x3500001の () 'でも、これよりはるかに巧妙ではない... – matejuh

+0

@matejuh:どこでブレークポイントを設定しましたか?ツールは自動的にあなたの問題を解決するつもりはない、あなたはそれを考え、それを効果的に使用する必要があります。 – maerics

+0

私は知っています、私は残念です。以前はgdbを使ったことがありません...以前のプロジェクトではValgrindを使っていました... – matejuh

0

2時間かけて問題を把握しました。何らかの理由で-sharedパラメータが原因です。本書の例では、このパラメタはありませんでした。私はlibrubyのロードに関する私の以前の問題のためにそれを追加しました。それはextconfによって作られたメイクファイルで見つけることができます。

関連する問題