Вывод собственного расширения gem для целей отладки - PullRequest
2 голосов
/ 31 мая 2019

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

1 Ответ

0 голосов
/ 02 июня 2019

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

gem 'example_gem', path: './example_gem'
...