С чего начать отслеживание исключения?

Я получаю исключение в производстве, которое не предоставляет информацию и информацию о трассировке стека. Как мне начать отладку, откуда это может происходить?

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

person Daniel Westendorf    schedule 25.10.2017    source источник
comment
Вы компилируете с --no-debug?   -  person Stephie    schedule 26.10.2017
comment
@ RX14, это было хорошим поводом. Я использую сборочный пакет Heroku, который, кажется, компилируется с --no-debug. Я попробую без этого флага и, надеюсь, получу лучшую трассировку стека.   -  person Daniel Westendorf    schedule 26.10.2017
comment
Я попытался отключить --no-debug с помощью PR для пакета сборки heroku, но столкнулся с проблемами компиляции. github.com/crystal-lang/heroku-buildpack-crystal/pull/ 26 github.com/crystal-lang/crystal/issues/4719   -  person Daniel Westendorf    schedule 26.10.2017
comment
Да, вместо этого вы должны отправить PR, чтобы попытаться выполнить нерелизную сборку, поскольку --release в настоящее время требует --no-debug. Без релиза это все еще очень быстро, так что не волнуйтесь.   -  person Stephie    schedule 26.10.2017
comment
Обновлю PR, спасибо @RX14   -  person Daniel Westendorf    schedule 26.10.2017


Ответы (2)


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 (строка: )< /а>

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.

Так что либо это ошибка при подключении, либо соединение прервано.

Учитывая невежественную трассировку стека, это было бы хорошим началом, если только вы не можете поделиться дополнительным кодом для просмотра.

Надеюсь, это поможет.

person Shaunak    schedule 26.10.2017

В конечном итоге это произошло из-за того, что производственный сервер отключил соединение Redis через некоторое время. Я переключился на redis-reconnect для автоматического повторного подключения.

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

person Daniel Westendorf    schedule 26.10.2017