2016-04-03 14 views
5

Ich versuche einfache Ruby-Funktion mit Ruby C-API aufrufen, wenn die kompilierte Ausgabe bekomme ich Segmentierung Fehler, ich bin mir nicht sicher, was das Problem ist, ich hoffe Sie Kann mir helfen, Danke.Segmentierungsfehler beim Aufruf einer Ruby-Funktion mit C api

C-Code (./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; 
} 

Ruby-Code (./func.rb)

def func(opts) 
    puts opts['key'] 
end 

Compile Flaggen

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 wenn ./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

Für was es wert ist, funktioniert Ihr Code für mich ok, obwohl mit einem anderen Betriebssystem, Compiler und Ruby-Version (Mac, Clang und Ruby-Versionen 2.3.0 und 2.2.3). – matt

+0

Ich habe gerade Ruby 2.2.3 + clang 3.4 probiert und bekomme immer noch einen Segmentierungsfehler. – Kikapi

+0

Es sieht so aus, als könnte es './Func.rb' nicht finden (wahrscheinlich LoadError, aber es könnte etwas anderes sein). Versuchen Sie, alles nach dem Aufruf von 'ruby_init()' in eine Funktion einzufügen und dann an 'rb_protect()' zu übergeben, da ansonsten das Aufheben von Exceptions zu Segfaults führen kann. Einbetten der MRT hat viele Fallstricke. – cremno

Antwort

0

läuft Es scheint einen Mangel an kanonischen Beispiele dafür, wie Rubin einzubetten (zumindest in der offiziellen Dokumentation). Das Beste, was ich finden kann, ist dies free chapter von der Picke, die besagt, dass Sie

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

Zur Einrichtung der Ruby-Interpreter müssen. Sie vermissen einiges davon, insbesondere da Ihr Absturz innerhalb require passiert, scheint die fehlende ruby_init_loadpath verdächtig zu sein.

In this thread (in denen Dave Thomas über Änderungen Einbettung Rubin fragt) Nobu sagt auch, dass Sie

RUBY_GLOBAL_SETUP 

vor Haupt benötigen.

Sie könnten auch interessiert sein an mruby, die entworfen wurde, um einfach einzubetten.

+0

Ich habe Ihren Vorschlag versucht, ich bekomme den gleichen Segmentierungsfehler. – Kikapi

+0

Genau das gleiche Backtrack? –

+0

Ich denke schon, https://gist.github.com/anonymous/6d147bc68490f24cc480b8bf37805756, btw bekomme ich diese Warnung: Datendefinition hat keinen Typ oder Speicherklasse [standardmäßig aktiviert] auf RUBY_GLOBAL_SETUP; – Kikapi

Verwandte Themen