gem的本机扩展的输出,用于调试

时间:2019-05-31 16:30:55

标签: ruby rubygems oci8

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

我尝试使用各种打印C函数(包括printf,fprintf到stderr和file,rb_p),但是它们都不起作用。但是,对gem的.rb文件所做的任何更改都会被打印出来。因此,我认为问题与构建本机扩展的方式有关。

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

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

但是它没有任何改变。

能否给我一个提示,如何使C文件中的打印方法起作用?我是否错过了实际上可以编译本机扩展的步骤?

我想做的调试是在测试过程中执行的,而我正在使用的命令是:

bundle exec m my_test.rb 

我要调试的gem是ruby-oci8,但我认为我的问题对于具有本机扩展名的每一个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"时,它由测试的输出显示。

1 个答案:

答案 0 :(得分:0)

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

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