ptrace가 할 수 없는 /proc로 디버거는 무엇을 할 수 있나요?

ptrace가 할 수 없는 /proc로 디버거는 무엇을 할 수 있나요?

이것ptrace에 관한 Wikipedia 기사설명하다:

컨트롤러와 대상 간의 통신은 ptrace에 대한 반복 호출을 통해 발생하며 둘 사이에 작은 고정 크기 메모리 블록을 전달합니다(호출당 두 개의 컨텍스트 스위치가 필요함). 이는 대량의 대상 메모리에 액세스할 때 매우 비효율적입니다. 단어 크기의 청크(단어당 하나의 ptrace 호출)로만 수행될 수 있습니다. [7] 따라서 Unix 버전 8에서는 프로세스가 다른 프로세스의 메모리에 직접 액세스할 수 있도록 허용하는 procfs를 도입했으며, 4.4BSD가 뒤따랐고 /proc를 사용한 디버거 지원은 Solaris, BSD 및 AIX에 상속되었으며 대부분 Linux를 통해 복사되었습니다.

더 빠른 메모리 액세스가 디버거가 관심을 갖는 유일하게 /proc허용되지만 불가능한 것입니까 ptrace? 예를 들어, 실행 중인 프로그램에 대한 더 많은 디버거 관련 정보를 얻을 수 있습니까 /proc? 디버거와 관련된 프로그램을 조작하는 다른 방법은 어떻습니까? 일반적으로 큰 메모리 블록을 읽는 것 /proc보다 더 효율적 입니까 ptrace, 아니면 큰 메모리 블록을 읽는 것이 성능이 현저히 낮은 유일한 경우입니까?

답변1

디버거가 다른 프로세스에 액세스하는 것을 선호하는 경우 ptrace()단어당 비용이 많이 드는 시스템 호출을 사용하여 한 번에 하나의 기계어에만 액세스할 수 있습니다.

반면 Procfs는 /proc/<pid>/as파일에 표시된 프로세스의 전체 주소 공간을 제공합니다. 파일 read()write()작업 에 대해 lseek()다른 프로세스에 더 빠르게 액세스할 수 있습니다.

ptrace()그러나 procfs는 레지스터 및 주소 공간 액세스뿐만 아니라 단일 단계 실행 및 유사한 기능을 제공하는 것보다 프로세스에 대한 더 많은 정보도 제공합니다 .

truss(1)유틸리티는 Roger Faulkner가 procfs의 일부로 작성했습니다. 이는 1986년 procfs에 고유한 또 다른 인터페이스를 기반으로 했지만 SunOS는 ptrace()1988년에 procfs 없이 동일한 기능을 제공하도록 시스템 호출을 향상했습니다. SunOS는 관련 프로그램을 호출합니다 trace(1).

/proc/<pid>/psinfoProcfs는 명령 도 제공합니다 ps. procfs를 사용할 수 있기 전에는 프로세스에 대한 인쇄된 정보를 ps실제로 읽었 /dev/kmem으며 그러한 정보를 검색하는 방식으로 인해 신뢰할 수 없었습니다.

참고: procfs를 통해 다른 프로세스로 이동하려면 ioctl()procfs의 ona 파일을 통해 수행 되며 ptrace()동일한 작업을 수행하기 위한 시스템 호출로 하위 명령을 제공합니다. 현재 ptrace()이는 procfs 기능을 위한 libc 래퍼로 구현됩니다.

또한 Solaris는 procfs를 제공할 뿐만 아니라 Sun Microsystems도 procfs를 사용한다는 점에 유의하십시오.로저 포크너procfs의 발명가. 이곳이 그가 다른 사람들과 함께 발전하는 곳이다프로세스 파일 시스템 2.

Linux에서 제공하는 procf는 다음과 호환되지 않습니다.공정 1...도 아니다프로세스 파일 시스템 2.

Solaris가 procfs를 통해 ptrace를 구현하는지 확인하려면 다음을 참조하세요.https://sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/src/lib/libc/i386/sys/ptrace.c

관련 정보