从哪里开始追踪异常?

时间:2017-10-25 23:30:31

标签: crystal-lang

我在生产中遇到一个例外,它没有提供和堆栈跟踪信息。如何开始调试可能来自哪里?

Oct 25 16:26:17 socket-proxy app/web.1: Exception: RedisError: Disconnected (Redis::DisconnectedError) 
Oct 25 16:26:17 socket-proxy app/web.1: 0x4af6ac: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x4ce900: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x4b553e: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x529d1c: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x518cb2: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x518064: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x521d82: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x51ed3b: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x5240e9: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x50b995: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x416209: ??? at ?? 
Oct 25 16:26:17 socket-proxy app/web.1: 0x0: ??? at ?? 

2 个答案:

答案 0 :(得分:4)

Ruby dev在这里所以不确定为什么堆栈跟踪被神秘地打印出来,但是如果你正在寻找一些关于在哪里看的线索我会从这个类开始:

redis/error.cr

# Exception for errors that Redis returns.
class Redis::Error < Exception
  def initialize(s)
    super("RedisError: #{s}")
  end
end

class Redis::DisconnectedError < Redis::Error
  def initialize
    super("Disconnected")
  end
end

现在显然只是在crystal-redis存储库中出现异常似乎是在这个类中:

redis/connection.cr (line: )

def receive_line
    line = @socket.gets(chomp: false)
    unless line
      raise Redis::DisconnectedError.new
    end
    line.byte_slice(0, line.bytesize - 2)
end

查看使用它的方法receive_line,在连接或Redis::Connection方法期间,receive显然会出现错误。

因此,无论是连接期间的错误,还是连接断开。

考虑到无能为力的堆栈跟踪,这将是一个良好的开端,除非您可以分享更多代码来查看。

希望有所帮助。

答案 1 :(得分:1)

这最终是因为生产服务器在一段时间后超时redis连接。我已切换到redis-reconnect以自动重新连接。

https://github.com/danielwestendorf/redis-reconnect