在客户的旧版 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::SHA2
:
https ://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"