Pi3 / pi3 /utils /debug.py
yyfz233's picture
Initial commit
853528a
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"
# Desired configuration
new_config = {
"version": "0.2.0",
"configurations": [
{
"name": "bash_debug",
"type": "debugpy",
"request": "attach",
"connect": {
"host": host,
"port": port
},
"justMyCode": False
},
]
}
# Ensure the .vscode directory exists
if not os.path.exists(".vscode"):
os.makedirs(".vscode")
# Write the updated configuration to launch.json
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
# 更新 launch.json
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.")