원격 디버깅

PyPy에는 가상 머신에 내장된 실험적인 원격 디버깅 기능이 있습니다. 이 기능을 사용하면 다른 PyPy 프로세스에 임의의 Python 코드를 주입할 수 있습니다. 현재로서는 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) 함수를 사용하면 됩니다.

보안

이 기능은 다른 프로세스의 힙 메모리에 쓰는 방식으로 구현됩니다. Linux에서는 process_vm_writev 함수를 사용합니다. 보안이 강화된(hardened) 대부분의 Linux 배포판에서는 Yama가 이 함수를 기본적으로 비활성화합니다. 따라서 위 명령을 실행하려면 sudo가 필요할 수 있습니다.

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