多次拨打ruby_init和ruby_finalize
Calling ruby_init and ruby_finalize multiple times
我目前正在尝试使用谷歌测试测试一些Ruby(2.3(C API。
但是我的测试崩溃了,因为我创建了一个在设置时调用ruby_init
并在拆卸时调用ruby_finalize
的夹具。
然后,我在灯具内部创建了一个"单例"来解决问题,但我想知道是否有另一种更简单的方法可以做到这一点。
我希望我的所有测试都在适当/干净的 VM 中运行。
下面是重现错误的简单示例:
#include <ruby.h>
int
main()
{
ruby_init();
ruby_finalize();
ruby_init();
ruby_finalize();
}
错误:
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7fa7f769a040 (LWP 6525))]
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fa7f6305c5d in __GI_abort () at abort.c:90
#2 0x00007fa7f634aaad in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7fa7f645957b "%sn") at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007fa7f6352298 in malloc_printerr (str=str@entry=0x7fa7f645ae88 "double free or corruption (!prev)") at malloc.c:5368
#4 0x00007fa7f635358c in _int_free (av=0x7fa7f668dc40 <main_arena>, p=0x7fa7f8023b50, have_lock=<optimized out>) at malloc.c:4288
#5 0x00007fa7f7092a8d in objspace_xfree (objspace=0x7fa7f7fb3d20, ptr=0x7fa7f8023b60, old_size=<optimized out>) at gc.c:7720
#6 0x00007fa7f70a514f in rb_io_fptr_finalize (fptr=0x7fa7f8023b60) at io.c:4338
#7 0x00007fa7f70897b1 in run_final (objspace=0x7fa7f7fb3d20, zombie=140359397235560) at gc.c:2691
#8 finalize_list (objspace=objspace@entry=0x7fa7f7fb3d20, zombie=140359397235560) at gc.c:2707
#9 0x00007fa7f7089870 in finalize_deferred (objspace=objspace@entry=0x7fa7f7fb3d20) at gc.c:2728
#10 0x00007fa7f7094280 in rb_objspace_call_finalizer (objspace=0x7fa7f7fb3d20) at gc.c:2794
#11 rb_gc_call_finalizer_at_exit () at gc.c:2780
#12 0x00007fa7f76b97e2 in main ()
你试过ruby_cleanup(0)
吗?
查看源代码,看起来ruby_finalize
只是确保 Ruby 代码完成(例如调用at_exit
钩子,可能杀死任何 Ruby 线程(。而ruby_cleanup
调用会完成,然后清理 VM 本身。
编辑:
根据我的测试,这个答案不起作用(尽管被接受(。不能在同一进程中重新启动 Ruby VM。我能想到的唯一解决方法是在分叉中启动 VM,以便您可以保证它被完全清理。
相关文章:
- 递归列出所有目录中的C++与Python与Ruby的性能
- 按原样保存用户输入 - Ruby on Rails
- 与其他语言相比的 Ruby 和指针
- 它可能的 C++ 正则表达式评估器与 Lambda 像 Ruby 一样?
- 在C 程序上嵌入Ruby源的错误
- 用 rice/ruby 包裹的纯虚拟 C++ 类在运行时引发 TypeError ( "is not a class (Module)" )
- 如何在 Ruby-C++ 扩展C++类中编写非静态方法
- 如何使用 Ruby 的 Enumerable .map 方法在 C++ 中执行类似于 map 的操作
- 访问用 OCaml 编写的库,并从 Ruby 代码C++
- 通过Swig从Ruby调用C 功能
- Ruby中的多维阵列,例如C
- 在 C++ 和 Ruby 中的进程之间交换信息
- 如果用户在Ruby with Rice中重新定义initialize(),则避免C++代码中的Segfault
- 在 Ruby 和 C++ 之间交换数据
- 有没有一个很好的通用方法来用ruby包装swig生成的类
- 使用Swig将std::set转换为ruby
- 在C中创建Ruby扩展时出错
- Ruby和C++中的左移16位
- make在swig-create-ruby包装器上失败
- C++可以被包装在一个Ruby C扩展中吗