FASTMM4 또는 기본 메모리 관리자를 사용하여 모든 응용 프로그램에서 인스턴스화 된 모든 객체를 나열하려면 어떻게합니까?인스턴스화 된 모든 객체를 나열하는 방법은 무엇입니까?
답변
아마도 FastMM4로 이것을 할 수는 있지만 복잡 할 것입니다. ScanForMemoryLeaks 프로 시저의 코드를 검토하여 완료 방법을 확인하십시오.
이 루틴은 예상 된 메모리 누수 목록에 대해 할당 된 모든 힙 메모리를 검사하고 개체 및 개체 클래스 이름을 포함하여 표시되는 모든 것을보고합니다. 원하는 모든 힙 메모리를 확인하고 발견 한 모든 오브젝트의 수 및 오브젝트 클래스 이름을보고하는 것이므로 정말 비슷한 작업입니다. 등록 된 포인터 목록 검사를 생략하고 객체가 아닌 모든 것을 필터링하십시오.
잘 지원되지는 않지만 권장되는 것은 아니지만 상황에 따라 TObject를 편집하여 작성 및 삭제를 기록 할 수 있습니다. 모든 개체는 TObject이므로 트릭을 수행 할 수 있습니다. 그러나 VCL을 수정하는 것은 정말 싫은 일입니다. 따라서 동일한 작업을 수행하는 Helper 객체 (2006 년부터 사용 가능)를 사용할 수 있을지 궁금합니다. 작성된 각 오브젝트의 세부 사항을 다른 목록 등에 작성하십시오.
아니요, 도우미 객체를 사용할 수 없습니다. – gabr
좋아요! 작동해야하지만 VCL 기본값 변경이 마지막 옵션이라고 생각합니다. 그러나 다른 해결책이 없다면 그렇게 할 것입니다. 감사. –
@ gabr : 목록이 글로벌 인 경우 그는 다음과 같이 할 수 있습니다. 도우미와 함께 할 수없는 것은 인스턴스 데이터를 만드는 것입니다. –
Tony Allen의 제안을 구현하는 흥미로운 방법은 런타임에 개체 작성 및 삭제 방법을 연결하는 것일 수 있습니다. 이 트릭을 수행 할 수있는 AsmProfiler 프로젝트 (작업 IMHO의 아주 좋은 비트)의 일부인 Google 코드에는 흥미로운 라이브러리가 있습니다. 모든 무거운 짐을 수행하는 KOLDetours 유닛에 대한 링크는 다음과 같습니다.
FWIW 델파이 4/5 일에 프레임 워크를 구현했습니다.이 프레임 워크에는 선택적으로 객체 생성/파괴를 추적하는 계측 된 기본 클래스가 포함되어 있습니다. 이는 객체 유출 등을 추적하는 데는 효과가 있었지만 엄청난 양의 정보가 생성되었습니다. FASTMM4는 셧다운시에 어떤 물체가 유출되었는지를 알아야하는 경우 훨씬 더 좋은 옵션입니다.
SetMemoryManager를 호출하여 메모리 관리자를 변경할 수 있습니다. 당신은 간단한 스텁이 될 자신 만의 MM을 작성할 수 있습니다 : 모든 호출을 이전 MM (FastMM, GetMemoryManager를 호출하여 얻을 수 있음)으로 리디렉션하고 모든 메모리 작업을 어딘가에 기록합니다. 호출 스택을보고 오브젝트 생성/제거를 감지 할 수 있습니다. 호출은 TObject의 NewInstance 메소드에서 수행해야합니다.
왜이 정보를 원하십니까? 메모리 누출을 찾으십니까? 나는 다른 방법이있을 수 있다고 생각한다. – Alex
@Alexander : 아니오! FASTMM4는 메모리 누출을 쉽게 보여줍니다. 사실, VCL의 특정 클래스가로드되었는지 인스턴스화했는지 알고 싶었지만 지금은이 질문을 전달합니다. 감사! –