사용자 모드와 커널 모드에서 이루어진 가상 메모리 액세스를 분석하는 방법은 무엇입니까?

사용자 모드와 커널 모드에서 이루어진 가상 메모리 액세스를 분석하는 방법은 무엇입니까?

특정 프로그램을 실행한 결과로 사용자 모드와 커널 모드에서 수행된 모든 가상 메모리 액세스에 대한 로그를 생성하고 싶습니다.

메모리 액세스 위치를 수집하는 것 외에도 다른 상태 정보(예: 명령 포인터, 스레드 식별자)도 캡처하고 싶습니다. 기본 도구를 사용해도 원하는 통계를 모두 수집할 수 없을 것으로 예상됩니다.

이 분석을 오프라인으로 수행할 계획이므로 성능에 미치는 영향은 걱정하지 않습니다. 실제로 사용 가능한 항목에 따라 어떤 도구가 모든 메모리 액세스를 기록할 수 있는지, 어떤 도구가 샘플링만 할 수 있는지 아는 것이 도움이 될 수 있습니다.

나는 원래는 사용자 모드 메모리 액세스만 기록한다는 사실을 깨닫기 전까지는 부적절한 도구인 Valgrind를 개선할 계획이었습니다. 사용할 수 있는 다른 도구를 조사하는 동안 어떤 도구가 내가 원하는 정보를 캡처할 것인지 빠르게 결정하는 방법을 모릅니다.

시작하는 데 도움이 된 몇 가지 리소스는 다음과 같습니다.

답변1

다른 사람이 비슷한 문제를 겪을 경우를 대비해 내가 찾은 정보로 내 질문을 업데이트하고 싶었습니다.

Linux 추적 도구에 대해 내가 이해한 바에 따르면 대부분은 프로브(실행 파일의 바이너리에 동적으로 삽입되는 계측을 설명하는 데 사용)와 추적점(검색을 활성화 또는 비활성화할 수 있는 코드로 컴파일된 코드를 설명하는 데 사용) 추적을 사용한다는 것입니다.더 큰확대/축소 이벤트(예: 함수 호출) 따라서 이러한 도구는 메모리 액세스와 같은 세부적인 항목을 추적하는 데 도움이 되지 않습니다.

Valgrind는 모든 메모리 액세스를 추적하는 데 유용합니다.사용자 코드(하지만커널 코드합성 CPU에서 프로그램을 실행하기 때문입니다. 문서에서:

그러면 프로그램은 Valgrind 코어가 제공하는 합성 CPU에서 실행됩니다. 새 코드가 처음 실행되면 코어는 코드를 선택한 도구에 전달합니다. 이 도구는 자체 계측 코드를 추가하고 결과를 코어에 반환하며, 코어는 해당 계측 코드의 지속적인 실행을 조정합니다.

이는 실행될 각 명령을 전달하는 구성 요소 수준에서 이러한 추적 정보를 수집해야 함을 나타내는 것으로 보입니다. 따라서 에뮬레이터를 사용하지 않고 실행 시 이 깊이와 폭의 정보를 얻을 수 있는 방법은 없는 것 같습니다.사용자 및 커널 코드.

이것은 내가 찾은 유일한 해결책으로 이어집니다: perf_event_open(). 프로세서의 PMU(성능 모니터링 장치)를 사용하여 메모리 액세스를 샘플링할 수 있습니다. perf_event_open()충분한 깊이의 정보(예: 명령 포인터, 메모리 주소, 프로그램 레지스터)를 제공할 수 있지만 폭은 제공할 수 없습니다.견본메모리 접근).

(또한 perf mem프런트 엔드는 메모리 액세스에 대한 정보 수집을 시작하기에 좋고 쉬운 장소입니다. 그런 다음 오프라인 처리 샘플을 사용할 수 있습니다 perf script.)

관련 정보