원격 디버깅

PyPy는 가상 머신에 내장된 실험적인 원격 디버깅 기능을 갖고 있습니다. 이는 임의의 Python 코드를 다른 PyPy 프로세스에 주입하는 데 사용할 수 있습니다. 지금까지는 Linux에서만 동작합니다. 이 메커니즘은 PEP 768에서 강한 영향을 받았습니다.

커맨드라인에서

다른 PyPy 프로세스에서 Python 코드를 직접 실행하려면 다음 명령을 실행할 수 있습니다:

pypy -m _pypy_remote_debug <pid> -c <code>

이것은 프로세스 ID가 pid인 다른 PyPy 프로세스가 주어진 code를 실행하도록 만듭니다.

또는 스크립트 파일을 전달할 수도 있습니다:

pypy -m _pypy_remote_debug <pid> <filename>

다른 프로세스가 현재 시스템 콜에 의해 블록되어 있거나 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가 필요할 수 있습니다.

이 기능은 PyPy를 실행할 때 -X disable-remote-debug옵션을 사용하거나 PYTHON_DISABLE_REMOTE_DEBUG 환경 변수를 설정하여 비활성화할 수 있습니다.