【发布时间】: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:
- 有没有办法让 Heroku 堆栈跟踪变得有意义?
- 是否有建议在开发环境中强制出错?
- 还有其他建议吗?
这是 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.c 和 qt.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