Browse Source

Add traceback to debug blocking issues

pull/4010/head
Rapptz 5 years ago
parent
commit
d6be6adf8b
  1. 13
      discord/gateway.py

13
discord/gateway.py

@ -33,6 +33,7 @@ import struct
import sys
import time
import threading
import traceback
import zlib
import websockets
@ -66,6 +67,7 @@ class KeepAliveHandler(threading.Thread):
shard_id = kwargs.pop('shard_id', None)
threading.Thread.__init__(self, *args, **kwargs)
self.ws = ws
self._main_thread_id = ws.thread_id
self.interval = interval
self.daemon = True
self.shard_id = shard_id
@ -106,7 +108,14 @@ class KeepAliveHandler(threading.Thread):
break
except concurrent.futures.TimeoutError:
total += 5
log.warning(self.block_msg, total)
try:
frame = sys._current_frames()[self._main_thread_id]
except KeyError:
msg = self.block_msg
else:
stack = traceback.format_stack(frame)
msg = '%s\nLoop thread stacktrace:\n%s' % (self.block_msg, ''.join(stack))
log.warning(msg, total)
except Exception:
self.stop()
@ -215,6 +224,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
self._dispatch_listeners = []
# the keep alive
self._keep_alive = None
self.thread_id = threading.get_ident()
# ws related stuff
self.session_id = None
@ -648,6 +658,7 @@ class DiscordVoiceWebSocket(websockets.client.WebSocketClientProtocol):
ws.gateway = gateway
ws._connection = client
ws._max_heartbeat_timeout = 60.0
ws.thread_id = threading.get_ident()
if resume:
await ws.resume()

Loading…
Cancel
Save