Ruby on rails 通过docker容器上的FFI调用C方法时出现分段错误

Ruby on rails 通过docker容器上的FFI调用C方法时出现分段错误,ruby-on-rails,ruby,dynatrace,Ruby On Rails,Ruby,Dynatrace,我试图将此代码段用作监视ruby应用程序的一部分。问题是,在我的计算机上的示例应用程序中,我在使其正常工作方面没有问题,但当我使用在docker ubuntu图像中运行的我们希望监视的应用程序时,我有分段错误: stub_version: 1.5.1 initializing OneAgentSdk > onesdk_initialize returned 0 --> ONESDK_SUCCESS > onesdk_agent_get_current_state = 0 (O

我试图将此代码段用作监视ruby应用程序的一部分。问题是,在我的计算机上的示例应用程序中,我在使其正常工作方面没有问题,但当我使用在docker ubuntu图像中运行的我们希望监视的应用程序时,我有分段错误:

stub_version: 1.5.1
initializing OneAgentSdk
> onesdk_initialize returned 0 --> ONESDK_SUCCESS
> onesdk_agent_get_current_state  = 0 (ONESDK_AGENT_STATE_ACTIVE)
> onesdk_agent_get_version_string = '1.197.133.20200723-114512'
[120] Puma starting in cluster mode...
[120] * Version 3.8.2 (ruby 2.5.8-p224), codename: Sassy Salamander
[120] * Min threads: 0, max threads: 16
[120] * Environment: production
[120] * Process workers: 4
[120] * Preloading application
[120] * Listening on tcp://0.0.0.0:9293
[120] Use Ctrl-C to stop
[120] - Worker 0 (pid: 238) booted, phase: 0
[120] - Worker 3 (pid: 250) booted, phase: 0
[120] - Worker 1 (pid: 242) booted, phase: 0
[120] - Worker 2 (pid: 244) booted, phase: 0
/app/lib/one-agent/oneagentsdk.rb:175: [BUG] Segmentation fault at 0x0000000000000000
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux-gnu]
对于那些不知道OneAgent是什么的人,它是Dynatrace监控解决方案的一部分。因为producent不支持这个ruby绑定,所以我无法从他们那里得到任何额外的反馈。但我不认为这个问题与绑定本身有关

通常情况下,这里发生的是C方法的执行:onesdk\u webapplicationinfo\u create\p。它不接受字符串,我们需要指针。在里面 有些方法正在检查字符串是ASCII还是UTF8,它们正在构建这个指针。我已经检查过这些元素中没有一个是nil,所以一般来说,我应该有适当的值传递给这个方法

我将这个脚本作为中间件调用,因为我在这个绑定中传递一些来自请求的信息(uri、响应时间、http方法、http响应代码),以便进行请求跟踪。我已经在同一个ruby版本的环境中运行了示例应用程序,一切正常,但我从运行在docker中的客户端获得的应用程序不能正常工作。我在想,字符串编码可能有问题,这会导致额外的字节,但字节数组大小有适当的长度,一切似乎都很好。我不是ruby专家,但也许你们中的一些人会对我可以检查的内容有一些额外的想法?:)

亲切问候,,
Sebastian

您可能需要向Dynatrace支持人员寻求帮助,因为当OneAgent SDK for Ruby在Docker内部运行时,听起来像是出现了一些小故障。我已经问过了,但Ruby上下文中不支持它(他们在hackathon中实现了)。总的来说,用于其他技术的OneAgent SDK在docker中运行良好,问题只出现在Alpine linux上。我假设当FFI制作指针时,问题就出现了,cpp不能访问这个内存块,我有分段错误。问题是Docker中的寻址内存和没有容器的寻址内存有什么区别?我已经与支持人员进行了检查,并且由FFI绑定包装的OneAgent SDK for C/C++在容器中正常工作。所以问题仍然是,当我使用完全相同的代码而不使用容器时,它是如何工作的,而不使用容器。根据内存指针,我可以检查哪些选项吗?我离开了FFI实现,使用的是本机扩展。现在它工作正常。您可能需要向Dynatrace支持人员寻求帮助,因为当OneAgent SDK for Ruby在Docker内部运行时,听起来像是出现了一些小故障。我已经问过了,但Ruby上下文中不支持它(他们在hackathon中实现了)。总的来说,用于其他技术的OneAgent SDK在docker中运行良好,问题只出现在Alpine linux上。我假设当FFI制作指针时,问题就出现了,cpp不能访问这个内存块,我有分段错误。问题是Docker中的寻址内存和没有容器的寻址内存有什么区别?我已经与支持人员进行了检查,并且由FFI绑定包装的OneAgent SDK for C/C++在容器中正常工作。所以问题仍然是,当我使用完全相同的代码而不使用容器时,它是如何工作的,而不使用容器。根据内存指针,我可以检查哪些选项吗?我离开了FFI实现,使用的是本机扩展。现在它工作得很好。