2013-03-03 4 views
0

Intel Inspector (네이티브 메모리 누수)에서 복잡한 .net/COM 응용 프로그램을 테스트하고 있습니다. .net 코드의 몇 군데에서 정적 필드의 COM 객체에 대한 참조를 캐싱하고 있습니다. 외관상으로는 경감은 그 (것)들을 새는 것과 같이 표시하고있다. 몇 가지 경우에는 억압 추가로 충분하지만 플래그가 지정된 (주 COM 개체의 일부로 생성 된) 개체 수가 제어 불능 상태 (수백 개) 일 수 있으며이를 억제하면 실제 누출과 유사한 패턴을 숨길 수 있습니다. 짧은 이야기 만들기 - 프로세스가 종료되기 직전에 appdomain에로드 된 모든 어셈블리의 모든 클래스를 반복하고 있으며 내 COM 객체를 참조하는 정적 필드를 null로 설정합니다. 나중에 유효한 캐쉬로 받아 들여지지 않더라도 COM 개체를 참조하는 모든 정적 필드를 인쇄 할 수 있다면 나중에 사용할 때 유용 할 것입니다 (실제 누수 일 수도 있음).정적 생성자가 .net에서 실행되었는지 감지하는 방법은 무엇입니까?

그러나 유형을 사용하지 않은 경우 getField (null인지 확인)를 호출 할 때 정적 생성자가 실행되어 더 많은 COM 객체를 만들 수 있습니다. 유형이 현재 AppDomain에서 사용 된 적이 있는지 감지 할 수있는 방법이 있습니까?

답변

0

자동으로 처리 할 수 ​​있다고 생각하지 않지만 정적 생성자를 등록 할 수는 있습니다. 따라서 어셈블리의 모든 클래스를 반복하는 대신 등록 된 모든 클래스를 반복합니다.

public static class ClassRegistrar 
{ 
    private static List<Type> registered = new List<Type>(); 
    public static void Register(Type type) 
    { 
     registered.Add(type); 
    } 
    public static IEnumerable<Type> Registered 
    { get { return registered; } } 
} 

public class MyClass 
{ 
    static MyClass() 
    { 
     ClassRegistrar.Register(typeof(MyClass)); 
    } 
} 
+0

불행히도 이것은 나에게 적합하지 않습니다. 이 테스트를 위해서만 프로덕션 코드를 변경할 수 없습니다. 두 번째 정적 생성자는 F # 코드에서 바인딩을 만들 때 컴파일러에서 실제로 생성됩니다. 따라서 등록을 수행하려면 많은 클래스를 변경해야하고 각 유형을 변경해야합니다. 누군가 다른 모듈/클래스에 바인딩을 추가해야합니다. – MichalMa

+0

글쎄, 짧은 대답은 당신이하고 싶은 일을 할 수 없다는 것입니다. 몇 가지 샘플 코드 (F #에서도)를 제공한다면, 아키텍처상의 단점이나 해결 방법을 밝힐 것으로 확신합니다. –

+0

Philip, 필자는 첫 번째 요점이 모든 것을 말해 준다고 생각합니다. 이는 단지 테스트 일 뿐이며 클래스 인스턴스화를 등록하기 위해 1000 개 이상의 프로젝트 변경을 정당화하지 않습니다. 최악의 경우 수동 디버깅 조사 (인스펙터가 어떤 클래스가 참조를 보유하고 있는지 누설 추적을 표시 할 때)를 기반으로 내 코드를 작성해야합니다. – MichalMa

관련 문제