ruby - 用于调试目的的 gem native 扩展的输出

标签 ruby rubygems oci8

在使用 gem 时,我在想要调试的 native 扩展(它是 gem 的一部分)中遇到了问题。我尝试在 C 代码中添加打印方法,但在使用 gem 时没有任何显示。

我已经尝试使用各种打印 C 函数(包括 printf、fprintf 到 stderr 和文件、rb_p),但它们都不起作用。但是,打印了对 gem 的 .rb 文件的任何更改。因此,我假设问题与构建 native 扩展的方式有关。

我尝试在添加打印方法之后但在使用 gem 之前使用以下 (oci8) 命令编译 gem:

ruby setup.rb config && ruby setup.rb setup && ruby setup.rb install 

但它并没有改变任何东西。

你能给我一个提示吗,如何使 C 文件中的打印方法起作用?我是否遗漏了一个实际编译 native 扩展的步骤?

我想做的调试是在测试的时候进行的,我使用的命令是:

bundle exec m my_test.rb 

我尝试调试的 gem 是 ruby​​-oci8,但我相信我的问题对于每个具有 native 扩展的 gem 都是通用的。

编辑:

这可能不是一个普遍的问题,所以我将准确描述我要实现的目标。

我想调试 ruby​​-oci8 gem 的原生扩展。在类里面Cursor ,在类初始值设定项中,调用了 C 扩展中的一个方法:

def initialize(conn, sql = nil)
  # ...
  __initialize(conn, sql) # Initialize the internal C structure.
end

我想在被调用的 C 函数中打印一些东西。 __initialize 函数位于 this文件(在 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 文件中,测试的输出也不会打印它。但是,当我在 cursor.rb 文件中添加 puts "Before __initialize" 时,测试的输出显示了它。

最佳答案

要使用本地版本的 gem,您需要将 bundler 指向它:

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

关于ruby - 用于调试目的的 gem native 扩展的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398752/

相关文章:

ruby OCI8 初始化缓慢

ruby-on-rails - 如何下载 URL 中可用的所有图像?

ruby - 在 ruby 中杀死整个进程树

ruby - 在 bash 中打开一个命名管道,而不读取或写入它

ruby-on-rails - 如何通过 Rails 模型将值设置为 null?

mysql - RoR数据库错误

ruby-on-rails - 修复错误 Gem Load Error is : uninitialized constant when run a gem in project

oracle - 我可以使用 PHP7 提高 oci8 的性能吗?

php - centos 6.5 安装 PHP 和 oci8 扩展

ruby-on-rails - 如何使 Rails 模型无效