1

在客户的旧版 Rails 2.1.1 应用程序中,我遇到了 ruby​​ 崩溃并发出“非法指令”的错误。崩溃是由调用 Digest::SHA2 上的方法触发的。

>> Digest::SHA2
=> Digest::SHA2
>> Digest::SHA2.new()
Illegal instruction

Rails 应用程序在负载均衡器后面的两台服务器上运行。两台服务器上的堆栈非常接近,只有一个会触发崩溃。它们都是 REE 1.8.7、Rails 2.1 和 Debian 6。一个运行 Linux 内核版本 3.9.3,一个运行 3.9.2 版本——但我不确定如何确定这是否相关。

Digest::SHA2似乎主要是在 C 中实现的。我对 C 知之甚少,诊断这个是我的头。任何正确方向的帮助/指针将不胜感激!

非常感谢!

环境信息

这是 REE 的源代码Digest::SHA2https ://github.com/FooBarWidget/rubyenterpriseedition187-330/tree/master/ext/digest/sha2

在遇到崩溃的服务器上:

hostname@node1:~/appname$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

hostname@node1:~/appname$ uname -a
Linux node1.hostname.org 3.9.2-x86_64-[redacted] #1 SMP Tue May 14 17:16:34 EDT 2013 x86_64 GNU/Linux

hostname@node1:~/appname$ which ruby
/opt/ruby-enterprise-1.8.7-2012.02/bin/ruby

hostname@node1:~/appname$ irb
irb(main):001:0> require 'digest'
=> true
irb(main):002:0> Digest::SHA2.hexdigest('foo')
=> "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
irb(main):003:0> exit

hostname@node1:~/appname$ ./script/console
Loading development environment (Rails 2.1.1)
>> Digest::SHA2.hexdigest('foo')
Illegal instruction

崩溃的服务器上:

hostname@node2:~/appname$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

hostname@node2:~/appname$ uname -a
Linux node2.hostname.org 3.9.3-x86_64-[redacted] #1 SMP Mon May 20 10:22:57 EDT 2013 x86_64 GNU/Linux

hostname@node2:~/appname$ which ruby
/opt/ruby-enterprise-1.8.7-2012.02/bin/ruby

hostname@node2:~/appname$ irb
irb(main):001:0> require 'digest'
=> true
irb(main):002:0> Digest::SHA2.hexdigest('foo')
=> "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
irb(main):003:0> exit

hostname@node2:~/appname$ ./script/console
Loading development environment (Rails 2.1.1)
>> Digest::SHA2.hexdigest('foo')
=> "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
4

0 回答 0