我最近在代理服务器后面设置了一个新的应用服务器(Ruby 1.8.7 REE,Rails 2.3.8,Passenger 3.0.9,Nginx 1.0.6),并且遇到了一些奇怪的行为。仅在此应用服务器上发布到/ login时,我收到502 Bad Gateway错误。这在其他应用服务器上不会发生,并且两者都设置相同。我已经将问题缩小到特定的代码行 - 保存Authlogic会话。当我注释掉这些行(特别是保存调用)时:
@user_session = UserSession.new(params[:user_session])
if @user_session.save
...
不再发生502错误。同样,当我在控制台中测试这些命令时,我收到非法指令响应并且控制台崩溃:
>> Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
>> @user_session = UserSession.new({"password"=>"password", "remember_me"=>"0", "login"=>"myuser"})
>> @user_session.save
Illegal instruction
在其他应用服务器上测试这个工作正常(控制台不会因非法指令结果而崩溃)。
知道从哪里开始排除故障?我在Rails日志或Nginx日志中看不到任何有价值的东西。
感谢。
修改
在系统调用digest.rb期间发生了非法指令。无论我使用Ubuntu Ruby Enterprise Edition包还是自己编译它都会发生同样的事情:
stat("/opt/ruby-enterprise-1.8.7-2011.12/lib/ruby/1.8/digest.rb", {st_mode=S_IFREG|0644, st_size=1145, ...}) = 0
open("/opt/ruby-enterprise-1.8.7-2011.12/lib/ruby/1.8/digest.rb", O_RDONLY) = 15
fstat(15, {st_mode=S_IFREG|0644, st_size=1145, ...}) = 0
close(15) = 0
--- SIGILL (Illegal instruction) @ 0 (0) ---
答案 0 :(得分:1)
这听起来与Ruby 1.9 Ramaze App Failing with “Illegal instruction”有关。
“非法指令”通常是来自CPU的错误消息,这意味着您尝试运行的某些二进制代码包含未在该特定CPU上实现的指令。
这可能有多种原因:
- 使用错误CPU的优化设置编译二进制文件。 CPU供应商一直在添加新的指令,如果编译器优化了比你的CPU更新的CPU,它可能会发出CPU不理解的指令。
- 编译器坏了。
- 二进制文件已损坏。
- 您正在编译的代码包含汇编代码或包含CPU没有的指令的内在函数。
原始问题提交者Phil Kulak回复说他发现堆栈溢出导致错误。