Sto provando a chiamare la semplice funzione ruby usando l'API di Ruby C, Quando eseguo l'output compilato ottengo un errore di segmentazione, non sono sicuro di quale sia il problema, spero che tu mi può aiutare, grazie.Errore di segmentazione quando si chiama una funzione Ruby usando C api
codice C (./func.c)
#include <ruby.h>
int main(){
VALUE obj;
VALUE result;
VALUE map;
ruby_init();
rb_require("./func.rb");
obj=rb_str_new_cstr("");
map = rb_hash_new();
rb_hash_aset(map, rb_str_new2("key"),rb_str_new2("val"));
result = rb_funcall(obj, rb_intern("func"), 1, map);
return 0;
}
codice Ruby (./func.rb)
def func(opts)
puts opts['key']
end
compilazione bandiere
gcc func.c -o func -I/home/wh/.rbenv/versions/2.1.6/include/ruby-2.1.0/x86_64-linux -I/home/wh/.rbenv/versions/2.1.6/include/ruby-2.1.0 -L/home/wh/.rbenv/versions/2.1.6/lib/ -lruby-static -lm -pthread -lcrypt -ldl -rdynamic
Segmentation fault quando si esegue ./func
<main>: [BUG] Segmentation fault at 0x00000000000018
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-linux]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:002468 TOP [FINISH]
-- C level backtrace information -------------------------------------------
./func() [0x581bcc] vm_dump.c:690
./func() [0x5f4893] error.c:312
./func(rb_bug+0xb3) [0x5f5a73] error.c:339
./func() [0x4f6c83] signal.c:824
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10340) [0x7f805628d340] ../nptl/sysdeps/pthread/funlockfile.c:29
./func() [0x416f03] eval_intern.h:157
./func(rb_require_safe+0x63c) [0x42038c] load.c:1017
./func(main+0x18) [0x418b05]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f8055ed9ec5] libc-start.c:287
./func() [0x418a23] enumerator.c:181
-- Other runtime information -----------------------------------------------
Segmentation fault (core dumped)
Per quello che vale, il tuo codice funziona bene per me, anche se con una versione OS, compilatore e Ruby diversa (Mac, clang e Ruby versioni 2.3.0 e 2.2.3). – matt
Ho appena provato Ruby 2.2.3 + clang 3.4 e sto ancora ricevendo un errore di segmentazione. – Kikapi
Sembra che non possa trovare './Func.rb' (probabilmente LoadError ma potrebbe essere qualcos'altro). Prova a racchiudere tutto in una funzione dopo la chiamata 'ruby_init()' e poi passarla a 'rb_protect()' altrimenti l'aumento delle eccezioni potrebbe causare segfault. Incorporare la risonanza magnetica ha molte insidie. – cremno