Files
2026-07-13 13:32:23 +08:00

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()