调试websocket 1006

时间:2016-06-29 03:41:58

标签: ruby websocket eventmachine

我正在构建基于ruby-websockets-chat-demo的服务器,但已将其扩展为支持跨隔离通道的一对一客户端/服务器通信。我的基本服务器此时工作正常,但我需要继续开发和扩展它。

我的问题是,无论何时在服务器内发生错误,都会向客户端抛出1006的关闭,它只是终止而不知道发生了什么。我认为这在生产中是有道理的,但它会对开发造成严重破坏。

我尝试过设置自己的救援和陷阱,但似乎只是被忽略了。使用RubyMine,我可以设置断点并遍历代码以找到它破坏的位置,然后确定问题,但这真的很痛苦。

我不知道是什么捕获了错误,无论是faye-websocket,eventmachine还是其他什么,真的。因为它是静默捕获和处理的,所以很难发现。

有没有办法禁用此陷阱?或者,在基于faye-websocket的客户端和服务器中调试问题的最佳方法是什么?尽可能搜索,我还没能找到这些信息。可能还没有达到适当的搜索标准。

1 个答案:

答案 0 :(得分:1)

回到基本的Ruby并在服务器的“on close”事件中插入此代码:

if @debug
 puts "MyserverBackend>> Close entered. Last error:#{$!.class}:#{$!.to_s};Module:#{$0};"
 $@.each { |backtrace| puts backtrace }
 exit
end

这标识了发生故障的位置并增强了调试功能。例如,当我通过在“on message”事件中发出“xputs”而不是“puts”强制错误时,我现在收到这个明确的信息:

MyserverBackend>> Close entered.  Last error:NoMethodError:undefined method `xputs' for #<Myserver::MyserverBackend:0x4c9b2e8>;Module:.../ruby/bin/rackup;Line:2;
.../projects/myserver/middlewares/myserver_backend.rb:45:in `block (2 levels) in call'
.../projects/myserver/middlewares/myserver_backend.rb:43:in `each'
.../projects/myserver/middlewares/myserver_backend.rb:43:in `block in call'
...

在此之前,我的客户端将以1006终止,服务器将不会通知我所发生的一切。希望这有助于其他人调试那些令人讨厌,无处不在的1006错误。

增加选项: 我找到了另一种选择。我执行此方法作为每个WS方法的第一个语句,如open / message / close / error。它与EventMachine有关,在faye-websocket中运行。我找到了here

def catch_error
  EventMachine.error_handler do |e|
    puts "Catch_error: #{caller[0]}: Last error:#{$!.class}:#{$!.to_s}; Module:#{$0}; Line:#{$.}; Error raised during event loop: Error:#{e.message}" #.red
    raise
  end
end
相关问题