首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中使用Singleton模块崩溃的Ruby

在C中使用Singleton模块崩溃的Ruby
EN

Stack Overflow用户
提问于 2022-04-18 19:07:42
回答 1查看 30关注 0票数 1

我试图使用Ruby的C API实现一个项目,这导致了以下问题。我有一个脚本需要Singleton模块,并且注意到我的程序总是崩溃,所以我将问题归结为使用以下代码:

代码语言:javascript
运行
复制
#include <ruby.h>

int main(int argc, char* argv[])
{
  ruby_init();
  rb_require("singleton");
  return ruby_cleanup(0);
}

使用

代码语言:javascript
运行
复制
gcc test.c `pkg-config --cflags --libs ruby`

每当我运行这个程序时,我都会在rb_require("singleton")上得到一个分段错误。

代码语言:javascript
运行
复制
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),并且总是遇到相同的问题,所以现在我认为我做错了什么。

有人能解释一下这里有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-19 09:05:08

为了使用rb_require,您需要首先调用ruby_init_loadpath

因此,这是可行的:

代码语言:javascript
运行
复制
int main(int argc, char* argv[])
{
  ruby_init();
  ruby_init_loadpath();

  rb_require("singleton");

  return ruby_cleanup(0);
}

在研究你的问题时,我发现这些是有用的:

在C中运行Ruby

如何在C++应用程序中完全初始化嵌入的ruby?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71916030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档