是否可以在同一进程中多次从C ++初始化Ruby?

时间:2017-06-30 14:11:11

标签: c++ ruby

我正在写一些单元测试。为此,我尝试初始化Ruby解释器并运行连续多次使用它的代码。它第一次工作正常,但在第二次运行时,Ruby代码崩溃了。到目前为止,很难将这个问题自上​​而下,所以我试图自下而上地重现它。从这个最小的例子开始,直接从Running Ruby in C文档。

是否可以在同一进程中多次初始化Ruby解释器? (我做错了吗?)

示例代码

#include <ruby.h>
#include <iostream>

int rbCycle(int argc, char* argv[])
{
    std::cout << "init" << std::endl;
    ruby_init();

    // char* options[] = { "-v", "-eputs 'Hello, world!'" };
    // void* node = ruby_options(2, options);

    // int state;
    // if (ruby_executable_node(node, &state))
    // {
    //     state = ruby_exec_node(node);
    // }
    // if ( state ) {
    //     std::cout << "error";
    // }

    std::cout << "cleanup" << std::endl;
    return ruby_cleanup(0);
}

int main(int argc, char* argv[])
{
    rbCycle(argc, argv);
    rbCycle(argc, argv);
}

我的编译命令行:

clang++ -g -O0 -o rb -I/System/Library/Frameworks/Ruby.framework/Versions/2.0/Headers -lruby ruby.cpp

观察

两次运行ruby_init()ruby_cleanup(0)周期会在第二次清理调用时触发崩溃。但是,启用注释代码后,它会在第二个周期的ruby_options调用中崩溃。

输出和堆栈跟踪仅使用init和cleanup

init
cleanup
init
cleanup

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x120)
  * frame #0: 0x00007fffc549838c libsystem_pthread.dylib`pthread_mutex_lock
    frame #1: 0x00000001001b4c59 libruby.2.0.0.dylib`___lldb_unnamed_symbol2793$$libruby.2.0.0.dylib + 9
    frame #2: 0x00000001001b1722 libruby.2.0.0.dylib`___lldb_unnamed_symbol2766$$libruby.2.0.0.dylib + 31
    frame #3: 0x00000001000bf116 libruby.2.0.0.dylib`ruby_cleanup + 55
    frame #4: 0x0000000100000f3b rb`rbCycle(argc=1, argv=0x00007fff5fbffa30) at ruby.cpp:22
    frame #5: 0x00000001000010da rb`main(argc=1, argv=0x00007fff5fbffa30) at ruby.cpp:28
    frame #6: 0x00007fffc5281235 libdyld.dylib`start + 1

启用注释代码的输出和堆栈跟踪

init
Hello, world!
cleanup
init

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x180)
  * frame #0: 0x00000001000befb4 libruby.2.0.0.dylib`ruby_options + 65
    frame #1: 0x0000000100000e3c rb`rbCycle(argc=1, argv=0x00007fff5fbffa30) at ruby.cpp:10
    frame #2: 0x000000010000107a rb`main(argc=1, argv=0x00007fff5fbffa30) at ruby.cpp:28
    frame #3: 0x00007fffc5281235 libdyld.dylib`start + 1

这是macOS 10.12.5上的ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]

0 个答案:

没有答案