gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:35 52 4
gpt4 key购买 nike

在使用 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/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com