当前,我正在研究解释器的调试方法,因为崩溃的原因是由于Ruby解释器的错误开发。
为了让我测试我的方法,我需要在解释器本身中引入已知的错误。因此,我想介绍一个错误(特别是段错误),并使用正确的(或有效的输入文件)让红宝石崩溃。这段由于Ruby本身的解释器和/或mJIT而不是输入* .rb程序而需要发生错误,因此我假设Ruby解释器是问题的根源并对其进行调试。
但是,每当我修改源代码并使用$sudo make install
重新编译ruby时,编译都会中止并出现以下错误:
generating encdb.h
miniruby: io.c:4737: rb_io_fptr_finalize_internal: Assertion `idx < 10' failed.
uncommon.mk:1032: recipe for target 'encdb.h' failed
make: *** [encdb.h] Aborted (core dumped)
添加到源代码中的代码如下(这不是段错误的示例):
int idx;
idx = rand() % 1000 + 100;
assert (idx < 10);
从语法上讲这是正确的,在编译期间不应抱怨,而应在运行时声明。
我的猜测是,ruby会对编译器进行一次预编译,然后使用miniruby运行它,然后,如果在运行过程中发生任何错误,它将中止整个编译过程。
我知道这是一个比较复杂的问题,但是没有人能通过编译任何代码修改来引入该错误来帮助我解决这个问题吗?