Вывод из собственного расширения gem для целей отладки

При использовании гема я столкнулся с проблемой в собственном расширении (которое является частью гема), которое я хотел отладить. Я попытался добавить методы печати в код 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, это отображается в результатах теста.


person Miron Marczuk    schedule 31.05.2019    source источник
comment
Не могли бы вы объяснить, что вы имеете в виду под методами печати? Но пока что вы смотрели на использование драгоценного камня? У вас есть доступ, чтобы увидеть код C изнутри. github.com/pry/pry   -  person lacostenycoder    schedule 31.05.2019
comment
Я попытался добавить fprintf (stderr, ....) в код C одного из моих доморощенных драгоценных камней, и он отлично работает, поэтому я думаю, что ему нужно будет более подробно объяснить, что именно вы делаете.   -  person varro    schedule 31.05.2019
comment
@lacostenycoder Под методами печати я подразумеваю такие функции, как, например, 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.2019
comment
@varro Я обновил вопрос, объяснив, чего я пытаюсь достичь.   -  person Miron Marczuk    schedule 01.06.2019
comment
@lacostenycoder Я связал pry в файле cursor.rb перед методом __initialize(..) (см. обновленный вопрос), и он показал мне содержимое oci8_stmt_initialize(..) функции WITH, добавленной printf("My debug code");. Это означает, что измененная функция используется во время выполнения, но, к сожалению, текст printf не присутствует в выводе теста.   -  person Miron Marczuk    schedule 01.06.2019
comment
Спасибо за дополнительную информацию. К сожалению, я не вижу ничего явно плохого. Я настоятельно рекомендую вам использовать fprintf (stderr, ...) вместо printf (), чтобы избежать возможных проблем с буферизацией (но я не думаю, что это ваша основная проблема). Я склонен думать, что это как-то связано с тем, как устроен гем oci8, а не с общей проблемой, основанной на моих собственных экспериментах с самодельным драгоценным камнем, где все работает, как ожидалось.   -  person varro    schedule 01.06.2019


Ответы (1)


Чтобы использовать локальную версию драгоценного камня, вам нужно указать на нее bundler:

gem 'example_gem', path: './example_gem'
person Christopher Oezbek    schedule 02.06.2019
comment
Спасибо за предложение, но это не решает проблемы. Изменения в файлах * .rb гемов распознаются, но изменения в * .c по-прежнему не распознаются. - person Miron Marczuk; 03.06.2019