원격 디버깅 =========== PyPy는 가상 머신에 내장된 실험적인 원격 디버깅 기능을 갖고 있습니다. 이는 임의의 Python 코드를 다른 PyPy 프로세스에 주입하는 데 사용할 수 있습니다. 지금까지는 Linux에서만 동작합니다. 이 메커니즘은 `PEP 768`_\ 에서 강한 영향을 받았습니다. .. _`PEP 768`: https://peps.python.org/pep-0768/ 커맨드라인에서 -------------- 다른 PyPy 프로세스에서 Python 코드를 직접 실행\ 하려면 다음 명령을 실행할 수 있습니다:: pypy -m _pypy_remote_debug -c 이것은 프로세스 ID가 ``pid``\ 인 다른 PyPy 프로세스가 주어진 ``code``\ 를 실행하도록 만듭니다. 또는 스크립트 파일을 전달할 수도 있습니다:: pypy -m _pypy_remote_debug 다른 프로세스가 현재 시스템 콜에 의해 블록되어 있거나 C 확장에서 오래 실행되는 계산을 수행하고 있는 경우, 해당 프로세스는 중단되지 않습니다. 이 경우 스크립트는 그 작업이 끝난 후에 실행됩니다. 예를 들어, 다른 프로세스가 자신의 (RPython 수준) 힙을 덤프하도록 하려면 다음을 실행할 수 있습니다:: pypy -m _pypy_remote_debug -c "import gc; gc.dump_rpy_heap('/tmp/rpy-heap-dump')" API ---- Python 코드에서 원격으로 코드를 실행하려면 ``__pypy__.remote_exec(pid, filename, wait=True)`` 함수가 있습니다. 보안 ---- 이 기능은 다른 프로세스의 힙 메모리에 쓰는 방식으로 구현됩니다. 리눅스에서는 ``process_vm_writev`` 함수를 사용합니다. 이 함수는 Yama_\ 에 의해 대부분의 강화된(hardened) 리눅스 배포판에서 기본적으로 비활성화되어 있습니다. 따라서 위 명령을 실행하려면 sudo가 필요할 수 있습니다. .. _Yama: https://www.kernel.org/doc/html/v4.15/admin-guide/LSM/Yama.html#ptrace-scope 이 기능은 PyPy를 실행할 때 ``-X disable-remote-debug``\ 옵션을 사용하거나 ``PYTHON_DISABLE_REMOTE_DEBUG`` 환경 변수를 설정하여 비활성화할 수 있습니다.