调试 websocket 1006

Debugging websocket 1006

我正在构建基于 ruby-websockets-chat-demo 的服务器,但已对其进行扩展以支持跨隔离通道的一对一 client/server 通信。我现在的基础服务器运行良好,但我需要继续开发和扩展它。

我的问题是,每当服务器发生错误时,都会向客户端抛出一个带有 1006 的关闭,并且它会在不知道发生了什么的情况下直接终止。我认为这在生产中是有意义的,但它会对开发造成破坏。

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

我不知道是什么导致了错误,是 faye-websocket、eventmachine 还是其他东西,真的。因为它是悄无声息地被发现和处理的,所以很难被发现。

有什么办法可以解除这个陷阱吗?或者,在基于 faye-websocket 的客户端和服务器中调试问题的最佳方法是什么?尽我所能搜索,我一直无法找到该信息。可能只是还没有找到合适的搜索条件。

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

if @debug
 puts "MyserverBackend>> Close entered. Last error:#{$!.class}:#{$!.to_s};Module:#{[=10=]};"
 $@.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:#{[=12=]}; Line:#{$.}; Error raised during event loop: Error:#{e.message}" #.red
    raise
  end
end