2016-04-03 7 views
5

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) 
+0

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

+0

Ho appena provato Ruby 2.2.3 + clang 3.4 e sto ancora ricevendo un errore di segmentazione. – Kikapi

+0

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

risposta

0

Sembra che ci sia una mancanza di esempi canonici di come incorporare rubino (almeno nella documentazione ufficiale). La cosa migliore che posso trovare è questo free chapter dal piccone che dice che è necessario

ruby_sysinit(&argc, &argv); 
RUBY_INIT_STACK; 
ruby_init(); 
ruby_init_loadpath(); 

Per impostare l'interprete ruby. Ti manca un po 'di questo, in particolare dato che il tuo arresto si verifica all'interno di require, il ruby_init_loadpath mancante sembra sospetto.

In this thread (in cui Dave Thomas chiede sulle modifiche al rubino embedding) Nobu dice anche che è necessario

RUBY_GLOBAL_SETUP 

prima principale.

Potreste anche essere interessati a mruby, che è stato progettato per essere facile da incorporare.

+0

Ho provato il tuo suggerimento, sto ricevendo lo stesso errore di segmentazione. – Kikapi

+0

Esattamente lo stesso backtrack? –

+0

Penso di sì, https://gist.github.com/anonymous/6d147bc68490f24cc480b8bf37805756, btw ottengo questo avviso: la definizione dei dati non ha tipo o classe di memoria [abilitata per impostazione predefinita] su RUBY_GLOBAL_SETUP; – Kikapi

Problemi correlati