在使用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"
时,它由测试的输出显示。
答案 0 :(得分:0)
要使用本地版本的gem,您需要将bundler
指向它:
gem 'example_gem', path: './example_gem'