При использовании драгоценного камня я столкнулся с проблемой в нативном расширении (которое является частью драгоценного камня), которую я хотел отладить. Я попытался добавить методы печати в коде C, но ничего не отображается при использовании драгоценного камня.
Я пытался использовать различные функции печати C (включая printf, fprintf для stderr и file, rb_p), но ни одна из них не работала. Тем не менее, любые изменения в файлах .rb gem были напечатаны. Поэтому я предположил, что проблема связана со способом создания собственных расширений.
Я пытался скомпилировать камень после добавления методов печати, но перед использованием камня, используя следующие (oci8) команды:
ruby setup.rb config && ruby setup.rb setup && ruby setup.rb install
но это ничего не изменило.
Подскажите, пожалуйста, как заставить работать методы печати в файлах C? Я пропускаю шаг, который на самом деле компилирует собственное расширение?
Отладка, которую я хочу сделать, выполняется во время тестирования, и я использую команду:
bundle exec m my_test.rb
Драгоценный камень, который я пытаюсь отладить, это ruby-oci8, но я считаю, что моя проблема является общей для каждого камня с собственным расширением.
EDIT:
Есть вероятность, что это может не быть общей проблемой, поэтому я опишу, чего именно я пытаюсь достичь.
Я хочу отладить собственное расширение гема ruby-oci8. В классе Cursor внутри инициализатора класса вызывается метод из расширения C:
def initialize(conn, sql = nil)
# ...
__initialize(conn, sql) # Initialize the internal C structure.
end
Я хочу напечатать что-то внутри вызываемой функции C. Функция __initialize находится в этом файле (в C он называется static VALUE oci8_stmt_initialize(VALUE self, VALUE svc, VALUE sql)
). Поэтому я хочу добавить, например,
static VALUE oci8_stmt_initialize(VALUE self, VALUE svc, VALUE sql)
{
printf("My debug code);
oci8_stmt_t *stmt = TO_STMT(self);
/* ... rest of the function */
}
И затем, при вызове тестов, которые используют соединение с базой данных и oci8 gem, я хочу увидеть:
$ bundle exec m my_test.rb
My debug code
В настоящее время, несмотря на то, что функция printf
добавлена в файл C, результаты теста не распечатывают ее. Однако, когда я добавил puts "Before __initialize"
в файл cursor.rb, он показывается в результатах теста.