61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
# Copyright (C) CVAT.ai Corporation
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import os
|
|
|
|
|
|
def is_debugging_enabled() -> bool:
|
|
return os.environ.get("CVAT_DEBUG_ENABLED") == "yes"
|
|
|
|
|
|
if is_debugging_enabled():
|
|
import debugpy
|
|
|
|
class RemoteDebugger:
|
|
"""
|
|
Support for VS code debugger.
|
|
|
|
Supports both single- and multi-thread scenarios.
|
|
|
|
Read docs: https://github.com/microsoft/debugpy
|
|
Read more: https://modwsgi.readthedocs.io/en/develop/user-guides/debugging-techniques.html
|
|
"""
|
|
|
|
ENV_VAR_PORT = "CVAT_DEBUG_PORT"
|
|
ENV_VAR_WAIT = "CVAT_DEBUG_WAIT"
|
|
__debugger_initialized = False
|
|
|
|
@classmethod
|
|
def _singleton_init(cls):
|
|
if cls.__debugger_initialized:
|
|
return
|
|
|
|
try:
|
|
port = int(os.environ[cls.ENV_VAR_PORT])
|
|
|
|
# The only intended use is in Docker.
|
|
# Using 127.0.0.1 will not allow host connections
|
|
addr = ("0.0.0.0", port) # nosec - B104:hardcoded_bind_all_interfaces
|
|
|
|
# Debugpy is a singleton
|
|
# We put it in the main thread of the process and then report new threads
|
|
debugpy.listen(addr)
|
|
|
|
# In most cases it makes no sense to debug subprocesses
|
|
# Feel free to enable if needed.
|
|
debugpy.configure({"subProcess": False})
|
|
|
|
if os.environ.get(cls.ENV_VAR_WAIT) == "yes":
|
|
debugpy.wait_for_client()
|
|
except Exception as ex:
|
|
raise Exception("failed to set debugger") from ex
|
|
|
|
cls.__debugger_initialized = True
|
|
|
|
def __init__(self) -> None:
|
|
self._singleton_init()
|
|
|
|
def attach_current_thread(self) -> None:
|
|
debugpy.debug_this_thread()
|