首页 > 解决方案 > 通过 docker 容器上的 FFI 调用 C 方法时出现分段错误

问题描述

我正在尝试使用此片段https://github.com/Dynatrace/OneAgent-SDK-Ruby-Sample-Binding/blob/master/oneagentsdk_demo.rb作为监视 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 监控解决方案的一部分。因此,制作人不支持这种红宝石绑定,我无法从他们那里得到任何额外的反馈。但我不认为这是与绑定本身有关的问题。

一般来说,那里发生的是执行这个 C 方法:onesdk_webapplicationinfo_create_p。它不接受字符串,我们需要指针。在 oneagentsdk.rb 中有一些方法正在检查字符串是 ASCII 还是 UTF8,并且它们正在构建这个指针。我已经检查过这些元素都不是零,所以一般来说我应该有适当的值传递给这个方法。

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

亲切的问候,塞巴斯蒂安

标签: ruby-on-railsrubydynatrace

解决方案


推荐阅读