Ruby 在 C 中使用 Singleton 模块崩溃
Ruby in C using Singleton module crashes
我试图使用 Ruby 的 C API 实现一个项目,这导致我遇到了以下问题。我有一个需要 Singleton 模块的脚本,发现我的程序总是崩溃,所以我将问题归结为使用以下代码:
#include <ruby.h>
int main(int argc, char* argv[])
{
ruby_init();
rb_require("singleton");
return ruby_cleanup(0);
}
编译使用
gcc test.c `pkg-config --cflags --libs ruby`
每当我 运行 这个我在 rb_require("singleton")
.
得到一个段错误
ruby: [BUG] Segmentation fault at 0x00000c
ruby 2.3.0p0 (2015-12-25) [i386-linux-gnu]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:001788 (none) [FINISH]
-- Machine register context ------------------------------------------------
GS: 0x00000063 FS: 0x00000000 ES: 0x0000002b DS: 0x0000002b EDI: 0x098163e8
ESI: 0xf7f7f230 EBP: 0xff8004c8 ESP: 0xff8004c4 EBX: 0x00000006 EDX: 0x00000000
ECX: 0x00000006 EAX: 0x09816410 TRA: 0x0000000e ERR: 0x00000004 EIP: 0xf7d29d76
CS: 0x00000023 EFL: 0x00010212 UES: 0xff8004c4 SS: 0x0000002b
-- C level backtrace information -------------------------------------------
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7e49c41]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7e49e33]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d267cc]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7dd4493]
linux-gate.so.1 [0xf7f9e090]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d29d76]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d2ae68]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d2b2d1]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d26e2b]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d28734]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d30903]
/lib/i386-linux-gnu/libruby-2.3.so.2.3(rb_require+0x3a) [0xf7d309da]
./a.out(main+0x23) [0x80485ee]
我在不同的机器上尝试了几个 Ruby 版本(2.3、2.5 和 2.7)并且总是 运行 遇到同一个问题,所以目前我认为我做错了什么。
谁能解释一下这可能是什么问题?
要使用 rb_require
,您需要先调用 ruby_init_loadpath
。
所以,这有效:
int main(int argc, char* argv[])
{
ruby_init();
ruby_init_loadpath();
rb_require("singleton");
return ruby_cleanup(0);
}
在研究您的问题时,我发现这些很有用:
Running Ruby in C
How do you fully initialize an embedded ruby VM in a C++ application?
我试图使用 Ruby 的 C API 实现一个项目,这导致我遇到了以下问题。我有一个需要 Singleton 模块的脚本,发现我的程序总是崩溃,所以我将问题归结为使用以下代码:
#include <ruby.h>
int main(int argc, char* argv[])
{
ruby_init();
rb_require("singleton");
return ruby_cleanup(0);
}
编译使用
gcc test.c `pkg-config --cflags --libs ruby`
每当我 运行 这个我在 rb_require("singleton")
.
ruby: [BUG] Segmentation fault at 0x00000c
ruby 2.3.0p0 (2015-12-25) [i386-linux-gnu]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:001788 (none) [FINISH]
-- Machine register context ------------------------------------------------
GS: 0x00000063 FS: 0x00000000 ES: 0x0000002b DS: 0x0000002b EDI: 0x098163e8
ESI: 0xf7f7f230 EBP: 0xff8004c8 ESP: 0xff8004c4 EBX: 0x00000006 EDX: 0x00000000
ECX: 0x00000006 EAX: 0x09816410 TRA: 0x0000000e ERR: 0x00000004 EIP: 0xf7d29d76
CS: 0x00000023 EFL: 0x00010212 UES: 0xff8004c4 SS: 0x0000002b
-- C level backtrace information -------------------------------------------
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7e49c41]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7e49e33]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d267cc]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7dd4493]
linux-gate.so.1 [0xf7f9e090]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d29d76]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d2ae68]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d2b2d1]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d26e2b]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d28734]
/lib/i386-linux-gnu/libruby-2.3.so.2.3 [0xf7d30903]
/lib/i386-linux-gnu/libruby-2.3.so.2.3(rb_require+0x3a) [0xf7d309da]
./a.out(main+0x23) [0x80485ee]
我在不同的机器上尝试了几个 Ruby 版本(2.3、2.5 和 2.7)并且总是 运行 遇到同一个问题,所以目前我认为我做错了什么。
谁能解释一下这可能是什么问题?
要使用 rb_require
,您需要先调用 ruby_init_loadpath
。
所以,这有效:
int main(int argc, char* argv[])
{
ruby_init();
ruby_init_loadpath();
rb_require("singleton");
return ruby_cleanup(0);
}
在研究您的问题时,我发现这些很有用:
Running Ruby in C
How do you fully initialize an embedded ruby VM in a C++ application?