【问题标题】:Where to start tracing down an exception?从哪里开始追踪异常?
【发布时间】:2017-10-25 23:30:31
【问题描述】:

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

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 ?? 

【问题讨论】:

  • 你用--no-debug编译吗?
  • @RX14 这是一个很好的线索。我正在使用 Heroku buildpack,它似乎与 --no-debug 一起编译。我会尝试不带该标志,并希望获得更好的堆栈跟踪。
  • 我尝试关闭 --no-debug 并为 heroku buildpack 提供 PR,但遇到了编译问题。 github.com/crystal-lang/heroku-buildpack-crystal/pull/26github.com/crystal-lang/crystal/issues/4719
  • 是的,你应该发送 PR 来尝试非发布版本,因为 --release 当前需要 --no-debug。没有发布它仍然非常快所以不用担心。
  • 我会更新 PR,谢谢@RX14

标签: crystal-lang


【解决方案1】:

这里的 Ruby 开发人员不确定为什么神秘地打印堆栈跟踪,但是如果您正在寻找一些关于在哪里查看的线索,我将从这门课开始:

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::Connectionreceive 方法中抛出的。

所以要么是连接过程中出错,要么是连接断开。

考虑到毫无头绪的堆栈跟踪,这将是一个好的开始,除非您可以分享更多代码来查看。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多