При использовании гема я столкнулся с проблемой в собственном расширении (которое является частью гема), которое я хотел отладить. Я попытался добавить методы печати в код C, но при использовании драгоценного камня ничего не отображается.
Я пробовал использовать различные функции печати C (включая printf, fprintf to 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, но я считаю, что моя проблема характерна для каждого драгоценного камня с собственным расширением.
РЕДАКТИРОВАТЬ:
Есть вероятность, что это не общая проблема, поэтому я точно опишу, чего я пытаюсь достичь.
Я хочу отладить собственное расширение gem 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, я хочу увидеть:
$ bundle exec m my_test.rb
My debug code
В настоящее время, несмотря на то, что функция printf
добавлена в файл C, результаты теста не распечатывают ее. Однако, когда я добавил puts "Before __initialize"
в файл cursor.rb, это отображается в результатах теста.
printf("My debug code");
,fprintf(stderr, "My debug code");
FILE* file = fopen("my_debug_file", "w"); fprintf(file, "My debug code");
иrb_p("My debug code");
(те функции, которые я пробовал использовать). - person Miron Marczuk   schedule 01.06.2019pry
в файле cursor.rb перед методом__initialize(..)
(см. обновленный вопрос), и он показал мне содержимоеoci8_stmt_initialize(..)
функции WITH, добавленнойprintf("My debug code");
. Это означает, что измененная функция используется во время выполнения, но, к сожалению, текст printf не присутствует в выводе теста. - person Miron Marczuk   schedule 01.06.2019