특정 프로그램을 실행한 결과로 사용자 모드와 커널 모드에서 수행된 모든 가상 메모리 액세스에 대한 로그를 생성하고 싶습니다.
메모리 액세스 위치를 수집하는 것 외에도 다른 상태 정보(예: 명령 포인터, 스레드 식별자)도 캡처하고 싶습니다. 기본 도구를 사용해도 원하는 통계를 모두 수집할 수 없을 것으로 예상됩니다.
이 분석을 오프라인으로 수행할 계획이므로 성능에 미치는 영향은 걱정하지 않습니다. 실제로 사용 가능한 항목에 따라 어떤 도구가 모든 메모리 액세스를 기록할 수 있는지, 어떤 도구가 샘플링만 할 수 있는지 아는 것이 도움이 될 수 있습니다.
나는 원래는 사용자 모드 메모리 액세스만 기록한다는 사실을 깨닫기 전까지는 부적절한 도구인 Valgrind를 개선할 계획이었습니다. 사용할 수 있는 다른 도구를 조사하는 동안 어떤 도구가 내가 원하는 정보를 캡처할 것인지 빠르게 결정하는 방법을 모릅니다.
시작하는 데 도움이 된 몇 가지 리소스는 다음과 같습니다.
답변1
다른 사람이 비슷한 문제를 겪을 경우를 대비해 내가 찾은 정보로 내 질문을 업데이트하고 싶었습니다.
Linux 추적 도구에 대해 내가 이해한 바에 따르면 대부분은 프로브(실행 파일의 바이너리에 동적으로 삽입되는 계측을 설명하는 데 사용)와 추적점(검색을 활성화 또는 비활성화할 수 있는 코드로 컴파일된 코드를 설명하는 데 사용) 추적을 사용한다는 것입니다.더 큰확대/축소 이벤트(예: 함수 호출) 따라서 이러한 도구는 메모리 액세스와 같은 세부적인 항목을 추적하는 데 도움이 되지 않습니다.
Valgrind는 모든 메모리 액세스를 추적하는 데 유용합니다.사용자 코드(하지만커널 코드합성 CPU에서 프로그램을 실행하기 때문입니다. 문서에서:
이는 실행될 각 명령을 전달하는 구성 요소 수준에서 이러한 추적 정보를 수집해야 함을 나타내는 것으로 보입니다. 따라서 에뮬레이터를 사용하지 않고 실행 시 이 깊이와 폭의 정보를 얻을 수 있는 방법은 없는 것 같습니다.사용자 및 커널 코드.
이것은 내가 찾은 유일한 해결책으로 이어집니다: perf_event_open()
. 프로세서의 PMU(성능 모니터링 장치)를 사용하여 메모리 액세스를 샘플링할 수 있습니다. perf_event_open()
충분한 깊이의 정보(예: 명령 포인터, 메모리 주소, 프로그램 레지스터)를 제공할 수 있지만 폭은 제공할 수 없습니다.견본메모리 접근).
(또한 perf mem
프런트 엔드는 메모리 액세스에 대한 정보 수집을 시작하기에 좋고 쉬운 장소입니다. 그런 다음 오프라인 처리 샘플을 사용할 수 있습니다 perf script
.)