메모리 리크 디텍터의 동작 원리
메모리 리크 디텍터는 실제로 어떻게 작동합니까?일반적인 기본 개념은 무엇입니까?이를 설명하는 언어로 C++를 사용할 수 있습니다.
누출 감지기는 몇 가지 다른 방식으로 작동합니다. 경우, 이행을 할 수 .malloc
★★★★★★★★★★★★★★★★★」free
할당 중에 더 많은 정보를 추적할 수 있고 성능에 관심이 없는 것으로 간주됩니다.이것은 작동 방식과 유사합니다.일반적으로, 다음의 임의의 주소malloc
는 있지만 'ed'는 아닌 'ed', 'ed'는 아니다free
가 유출되었습니다.
기본적인 실장은 매우 간단합니다.모든 할당과 해당 행 번호의 룩업테이블을 유지하고 엔트리가 해방되면 엔트리를 삭제합니다.프로그램이 완료되면 모든 리크된 메모리를 나열할 수 있습니다.어려운 부분은 언제 어디서 할당이 해제되었어야 하는지를 결정하는 것입니다.같은 주소에 대한 포인터가 여러 개 있을 경우 이 작업은 더욱 어려워집니다.
실제로는 단일 회선 번호뿐만 아니라 잃어버린 할당에 대한 스택트레이스가 필요할 수 있습니다
또 다른 접근 방식은 가상 머신 전체를 구현하여 주소와 메모리 참조 및 관련 부기를 추적하는 밸런스라인드의 작동 방식입니다.밸라인드 접근법은 비용이 훨씬 더 많이 들 뿐만 아니라 범위를 벗어난 읽기 또는 쓰기 등 다른 유형의 메모리 오류에 대해서도 알 수 있기 때문에 훨씬 효과적입니다.
Valgrind는 기본적으로 기본 명령을 계측하여 지정된 메모리 주소에 더 이상 참조가 없을 때 추적할 수 있습니다.주소의 할당을 추적하는 것으로, 메모리의 일부가 없어졌을 뿐만 아니라, 언제 없어졌는지를 정확하게 알 수 있습니다.
C는 C++를 에 두 의 누출 모두에서 만듭니다. C++ 에new
★★★★★★★★★★★★★★★★★」delete
엄밀히 말하면new
이 될 수 있다malloc
많은 실제 C에서는 C++만 malloc
new
사용법을 할 수 .malloc
대체 접근법 대신.
또한 C은 C++와 같이 를 할당하는 상위 있는 .std::vector
★★★★★★★★★★★★★★★★★」std::list
기본 누출 감지기는 상위 레벨 모드에 의해 발생할 수 있는 많은 할당을 별도로 보고한다.컨테이너 전체를 잃어버렸다고 말하는 것보다 훨씬 덜 유용하네요.
다음은 Check Pointer 툴의 작동 원리에 관한 기술 자료입니다.
기본적으로 모든 값(히프 및 스택)의 수명과 언어에 의해 정의된 유형에 따른 크기를 추적합니다.이를 통해 Check Pointer는 누수뿐만 아니라 스택 내의 어레이에서도 어레이를 벗어난 액세스를 찾을 수 있습니다.이러한 접근은 검출되지 않습니다.
특히, 소스 코드를 분석하여 포인터의 모든 용도를 찾습니다.(이것은 그 자체만으로도 상당한 작업입니다).
다음과 같이 구성된 각 포인터의 포인터 메타 데이터를 추적합니다.
- 포인터와 포인터가 가리키는 힙 할당 개체 또는 글로벌 또는 로컬 변수 또는 함수에 대한 개체 메타 데이터에 대한 참조입니다.
- 포인터가 현재 액세스할 수 있는 개체의 (서브) 개체의 주소 범위입니다.이 값은 전체 개체의 주소 범위보다 작을 수 있습니다. 예를 들어 구조 멤버의 주소를 가져가는 경우, 계측된 소스 코드는 결과 포인터를 사용할 때만 해당 멤버에 대한 액세스를 허용합니다.
또한 각 객체의 종류와 위치(함수, 글로벌 변수, 스레드 로컬 변수 또는 로컬 변수, 힙 할당 메모리 또는 문자열 리터럴 상수)를 추적합니다.
- 안전하게 액세스할 수 있는 개체의 주소 범위 및
- 힙 할당 개체 또는 변수에 저장된 각 포인터에 대해 해당 포인터의 포인터 메타데이터에 대한 참조입니다.
이 모든 추적은 원본 프로그램 소스를 원본 프로그램이 하는 것을 실행하는 프로그램으로 변환하고 다양한 메타데이터 검사 또는 업데이트 루틴을 인터리브함으로써 이루어집니다.결과 프로그램이 컴파일되어 실행됩니다.실행 시 메타 데이터 검사가 실패하는 경우 백트레이스에는 오류 유형의 보고서(무효 포인터, 유효한 경계를 벗어난 포인터 등)가 제공됩니다.
이 태그는 C와 C++로 되어 있으며 운영체제는 언급되어 있지 않습니다.이 답은 Windows용입니다.
C
Windows 에는 가상 메모리의 개념이 있습니다.프로세스가 취득할 수 있는 메모리는 모두 가상 메모리입니다.이는 VirtualAlloc() [MSDN]를 통해 이루어집니다.리크 디텍터가 그 함수에 브레이크 포인트를 설정하고 콜이 호출될 때마다 콜스택을 취득하여 어딘가에 저장합니다.Virtual Free() [MSDN]에서도 같은 처리를 할 수 있습니다.
그 차이를 식별하여 저장된 콜스택과 함께 표시할 수 있습니다.
C++
C++는 다른 개념으로 VirtualAlloc()에서 가져온 큰 64kb 블록을 힙이라고 하는 작은 조각으로 분할합니다.C++ 힙 매니저는 Microsoft에서 제공되며 새로운 메서드 HeapAlloc() [MSDN] 및 HeapFree() [MSDN]를 제공합니다.
그러면 이전과 동일한 작업을 수행할 수 있지만 실제로는 해당 기능이 이미 내장되어 있습니다.Microsoft 의 GFlags [MSDN]툴로 트래킹을 유효하게 할 수 있습니다.
이 경우 C++ 힙 매니저 콜의 콜 스택 정보는 최대 50 MB까지 저장됩니다.
이 설정은 Windows 레지스트리를 통해서도 유효하게 할 수 있기 때문에, 메모리 누전 검출기로 간단하게 사용할 수 있습니다.
일반적인 개념
보시는 바와 같이 일반적인 개념은 할당과 할당 해제를 추적하여 비교하고 차이의 콜스택을 표시하는 것입니다.
언급URL : https://stackoverflow.com/questions/28446850/memory-leak-detectors-working-principle
'programing' 카테고리의 다른 글
Vue mapState 비반응 (0) | 2022.07.03 |
---|---|
Vuex 작업 및 구성 요소에서 경로 변경 (0) | 2022.07.02 |
int를 4바이트 문자 배열로 변환(C) (0) | 2022.07.02 |
C/C++의 const 어레이와 static const 어레이의 차이점은 무엇입니까? (0) | 2022.07.02 |
vuelidate에 sameAs를 사용하면 왜 작동하지 않는 거죠? (0) | 2022.07.02 |