import os
import re
import sys
import time
from pathlib import Path
"""
The following parameter determines the sleep time of the Python process after a signal
is sent that attaches the Rust LLDB debugger. If the Rust LLDB debugger attaches to the
current session too late, it might miss any set breakpoints. If this happens
consistently, it is recommended to increase this value.
"""
LLDB_DEBUG_WAIT_TIME_SECONDS = 1
def launch_debugging() -> None:
"""
Debug Rust files via Python.
Determine the pID for the current debugging session, attach the Rust LLDB launcher,
and execute the originally-requested script.
"""
if len(sys.argv) == 1:
msg = (
"launch.py is not meant to be executed directly; please use the `Python: "
"Debug Rust` debugging configuration to run a python script that uses the "
"polars library."
)
raise RuntimeError(msg)
pID = os.getpid()
launch_file = Path(__file__).parents[2] / ".vscode/launch.json"
if not launch_file.exists():
msg = f"Cannot locate {launch_file}"
raise RuntimeError(msg)
with launch_file.open("r") as f:
launch_info = f.read()
pattern = re.compile('("Rust LLDB",\\s*"pid":\\s*")\\d+(")')
found = pattern.search(launch_info)
if not found:
msg = (
"Cannot locate pid definition in launch.json for Rust LLDB configuration. "
"Please follow the instructions in the debugging section of the "
"contributing guide (https://docs.pola.rs/development/contributing/ide/#debugging) "
"for creating the launch configuration."
)
raise RuntimeError(msg)
launch_info_with_new_pid = pattern.sub(rf"\g<1>{pID}\g<2>", launch_info)
with launch_file.open("w") as f:
f.write(launch_info_with_new_pid)
print(f"pID = {pID}")
time.sleep(LLDB_DEBUG_WAIT_TIME_SECONDS)
sys.argv.pop(0)
with Path(sys.argv[0]).open() as fh:
script_contents = fh.read()
file_to_execute = Path(sys.argv[0])
exec(
compile(script_contents, file_to_execute, mode="exec"), {"__name__": "__main__"}
)
if __name__ == "__main__":
launch_debugging()