누군가 Valgrind가 어떻게 작동하는지에 대한 빠른 최고 수준의 설명을 제공 할 수 있습니까? 예 : 메모리가 할당되고 해제되는시기를 어떻게 알 수 있습니까?
답변:
Valgrind는 기본적으로 "샌드 박스"에서 애플리케이션을 실행합니다. 이 샌드 박스에서 실행하는 동안 자체 지침을 삽입하여 고급 디버깅 및 프로파일 링을 수행 할 수 있습니다.
매뉴얼에서 :
그런 다음 프로그램은 Valgrind 코어에서 제공하는 합성 CPU에서 실행됩니다. 새 코드가 처음으로 실행되면 코어는 선택한 도구에 코드를 전달합니다. 이 도구는 자체 계측 코드를 여기에 추가하고 결과를 코어에 다시 전달하여 계측 된 코드의 지속적인 실행을 조정합니다.
따라서 기본적으로 valgrind는 애플리케이션을 실행하는 가상 프로세서를 제공합니다. 그러나 응용 프로그램 지침이 처리되기 전에 도구 (예 : memcheck)로 전달됩니다. 이러한 도구는 일종의 플러그인과 비슷하며 프로세서에서 실행되기 전에 애플리케이션을 수정할 수 있습니다.
이 접근 방식의 가장 좋은 점은 valgrind에서 실행하기 위해 프로그램을 수정하거나 다시 연결할 필요가 없다는 것입니다. 이로 인해 프로그램이 느리게 실행되지만 valgrind는 성능을 측정하거나 애플리케이션의 정상적인 실행 중에 실행되는 것이 아니므로 실제로 문제가되지 않습니다.
Valgrind는 동적 바이너리 계측 (DPI) 프레임 워크를 사용하여 메모리 할당을 확인하고 교착 상태를 감지하며 애플리케이션을 프로파일 링하는 DPA (Dynamic Binary Analysis) 도구입니다. DPI 프레임 워크에는 자체 저수준 메모리 관리자, 스케줄러, 스레드 처리기 및 신호 처리기가 있습니다. Valgrind 도구 모음에는 다음과 같은 도구가 포함됩니다.
Valgrind 도구는 분해 및 재 합성 메커니즘을 사용하여 응용 프로그램을 프로세스에로드하고, 응용 프로그램 코드를 분해하고, 분석을위한 계측 코드를 추가하고, 다시 어셈블하고 응용 프로그램을 실행합니다. JIT (Just Intime Compiler)를 사용하여 계측 코드와 함께 응용 프로그램을 포함합니다.
Valgrind Tool = Valgrind Core + Tool Plugin
Valgrind Core는 애플리케이션 코드를 분해하고 코드 조각을 도구 플러그인에 전달하여 계측합니다. 도구 플러그인은 분석 코드를 추가하고 다시 조립합니다. 따라서 Valgrind는 Valgrind 프레임 워크 위에 자체 도구를 작성할 수있는 유연성을 제공합니다. Valgrind는 섀도우 레지스터와 섀도우 메모리를 사용하여 읽기 / 쓰기 명령, 읽기 / 쓰기 시스템 호출, 스택 및 힙 할당을 계측합니다.
Valgrind는 시스템 호출에 대한 래퍼를 제공하고 모든 시스템 호출에 대한 사전 및 사후 콜백을 등록하여 시스템 호출의 일부로 액세스 된 메모리를 추적합니다. 따라서 Valgrind는 Linux 운영 체제와 클라이언트 응용 프로그램 간의 OS 추상화 계층입니다.
다이어그램은 Valgrind의 8 단계를 보여줍니다.
여기에서 몇 가지 좋은 정보를 찾을 수 있습니다.
LD_PRELOAD에 익숙해 지십시오.