| | import os |
| | import json |
| | import debugpy |
| | import socket |
| | import random |
| |
|
| | def update_vscode_launch_file(host: str, port: int): |
| | """Update the .vscode/launch.json file with the new host and port.""" |
| | launch_file_path = ".vscode/launch.json" |
| | |
| | new_config = { |
| | "version": "0.2.0", |
| | "configurations": [ |
| | { |
| | "name": "bash_debug", |
| | "type": "debugpy", |
| | "request": "attach", |
| | "connect": { |
| | "host": host, |
| | "port": port |
| | }, |
| | "justMyCode": False |
| | }, |
| | ] |
| | } |
| |
|
| | |
| | if not os.path.exists(".vscode"): |
| | os.makedirs(".vscode") |
| |
|
| | |
| | with open(launch_file_path, "w") as f: |
| | json.dump(new_config, f, indent=4) |
| | print(f"Updated {launch_file_path} with host: {host} and port: {port}") |
| |
|
| | def is_port_in_use(host, port): |
| | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: |
| | return s.connect_ex((host, port)) == 0 |
| |
|
| | def setup_debug(is_main_process=True, max_retries=10, port_range=(10000, 20000)): |
| | if is_main_process: |
| | host = os.environ['SLURM_NODELIST'].split(',')[0] |
| |
|
| | for _ in range(max_retries): |
| | port = random.randint(*port_range) |
| | try: |
| | if is_port_in_use(host, port): |
| | print(f"Port {port} is already in use, trying another...") |
| | continue |
| |
|
| | |
| | update_vscode_launch_file(host, port) |
| |
|
| | print("master_addr = ", host) |
| | debugpy.listen((host, port)) |
| | print(f"Waiting for debugger attach at port {port}...", flush=True) |
| | debugpy.wait_for_client() |
| | print("Debugger attached", flush=True) |
| | return |
| | except Exception as e: |
| | print(f"Failed to bind to port {port}: {e}") |
| |
|
| | raise RuntimeError("Could not find a free port for debugpy after several attempts.") |