【问题标题】:Debugging seg fault on Heroku with native gem使用原生 gem 在 Heroku 上调试 seg 错误
【发布时间】:2014-05-06 00:39:34
【问题描述】:

我之前写过原生 ruby​​ gems,并在 Heroku 上运行它们,结果很好。但是这个让我难住了。

所有测试——激进的测试——在 Mac OS X(Mavericks)和 Linux 下都运行良好(尽管我唯一可以访问的安装是 Redhat)。在 Heroku 上,实时数据上的相同 gem seg 错误比测试更小更简单。该 gem 在我的 OS X Rails 开发环境中也可以正常运行,并带有从 Heroku 下载的实时数据的副本。

Heroku 日志中的堆栈跟踪没有帮助。 Ruby 级别的跟踪显示了有问题的调用。伟大的。但是C调用堆栈很奇怪。它具有顶级 gem API 调用,其行号没有任何意义。来自我的 gem 的更深的堆栈框架名称文件似乎大致可能,但行号指向直线代码和空格,而不是调用站点。调试信息映射好像有点不对。

另一个问题是,即使文件名来自我的 gem,引用的 .so 文件也是错误的(实际上是 zlib)。

堆栈跟踪的一般形式似乎指向内存分配或释放或虚假指针引用错误,因此我按照these instructions 运行valgrind 下的gem。它完全干净。

不知道从这里去哪里。对我来说似乎合理的问题,但 YMMV:

  1. 有没有办法让 Heroku 堆栈跟踪变得有意义?
  2. 是否有建议在开发环境中强制出错?
  3. 还有其他建议吗?

这是 Heroku 跟踪的相关部分。如果有人认为相关,我可以概括整个事情。

2014-05-05T01:20:29.366714+00:00 app[web.1]: /app/vendor/ruby-1.9.3/bin/ruby(rb_bug+0xb3) [0x573153] error.c:277
2014-05-05T01:20:29.366720+00:00 app[web.1]: /app/vendor/ruby-1.9.3/bin/ruby() [0x4b5f50] signal.c:644
2014-05-05T01:20:29.366722+00:00 app[web.1]: /lib/libpthread.so.0(+0xf8f0) [0x7f99ace9f8f0]
2014-05-05T01:20:29.366724+00:00 app[web.1]: /lib/libz.so.1(adler32+0x288) [0x7f99ab0325b8]
2014-05-05T01:20:29.366726+00:00 app[web.1]: /lib/libz.so.1(+0x4f8d) [0x7f99ab034f8d] qt.c:58
2014-05-05T01:20:29.366728+00:00 app[web.1]: /lib/libz.so.1(+0x699d) [0x7f99ab03699d] lulu.c:208
2014-05-05T01:20:29.366730+00:00 app[web.1]: /lib/libz.so.1(deflate+0x151) [0x7f99ab035281] qt.c:24
2014-05-05T01:20:29.366732+00:00 app[web.1]: /lib/libz.so.1(compress2+0xa6) [0x7f99ab032986] marker.c:76
2014-05-05T01:20:29.366734+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/lulu-0.0.2/lib/lulu/lulu.so(+0x6e82) [0x7f99a6ddce82] lulu.c:223
2014-05-05T01:20:29.369302+00:00 app[web.1]:   428 /app/vendor/bundle/ruby/1.9.1/gems/sass-3.2.14/lib/sass/selector/abstract_sequence.rb

我的宝石被命名为lulu。底部条目是初始调用,更高的帧在引发错误的signal.c 结束。 marker.cqt.c 是我的文件,但它们是在 lulu.so 中定义的,而不是 zlib

Here is source code,虽然我不希望任何人进行代码审查...我调用所有的 ruby malloc 例程就像一个好的红宝石公民。顺便说一句,它是 ruby​​ 1.9.3。

加法

也许我有线索。引用lulu.c:223 是对我自己的函数compress 的调用。在zlib 中也有一个compress。我的猜测是动态加载器弄错了。请稍等,我尝试重命名compress

【问题讨论】:

    标签: ruby-on-rails c ruby heroku gem


    【解决方案1】:

    事实证明,加载程序在 zlib 中找到了 compress,而不是在我的代码中找到了同名函数。

    调用和定义在同一个C文件中!我没有意识到 Linux 会在同一个目标文件中动态链接一个函数及其用途,并且更喜欢以前加载的同名函数!

    我通过将我的 compress 声明为静态来解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2016-12-04
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多