В настоящее время я занимаюсь исследованием метода отладки интерпретатора, поскольку случай сбоя связан с ошибкой разработки в интерпретаторе Ruby.
Чтобы проверить мой метод, мне нужно внести известную ошибку в сам интерпретатор. Таким образом, я хотел бы ввести ошибку (в частности, seg. Fault) и позволить аварийному завершению работы рубина с правильным (или допустимым входным файлом). Это сег. Ошибка должна возникать из-за интерпретатора и / или mJIT самого Ruby, а не из-за входной программы * .rb, поэтому я предполагаю, что интерпретатор Ruby является источником проблемы, и отладьте ее.
Однако всякий раз, когда я изменяю исходный код и перекомпилирую ruby с помощью $sudo make install
, компиляция прерывается с ошибкой ниже:
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, а затем, если во время этого запуска возникает какая-либо ошибка, он прерывает всю процедуру компиляции (make).
Я знаю, что это довольно сложная проблема, но кто-нибудь может мне помочь, как обойти эту проблему, скомпилировав с любой модификацией кода, чтобы ввести ошибку?