2010-03-08 2 views
3
나는 출시되지 않은 COM 참조를 디버깅 할 수있는 도구를 찾고있다

, 그것은 일반적으로 예를 들어, 원인 코드가 올바르게 모든 COM 인스턴스에서 Marshal.ReleaseCOMObject을 호출하지 않는 경우 Word/Outlook 프로세스가 메모리에 정지합니다. Outlook 2007에서는 Outlook addins에 대해 부분적으로이 문제가 해결되었지만 이는 일반적인 질문입니다.관리되지 않는 COM 참조를 관리되는 코드에서 디버깅하는 방법?

(유형별) COM 참조 적어도 목록을 표시 할 수있는 도구가 있습니까 관리 코드 보유? 이상적으로는 참조 증가가 발생한 곳을 디버깅하는 데 도움이되는 메모리 프로파일 러 스타일의 객체 트리도 표시합니다.

런타임시 디버깅은 정지 된 프로세스에 연결할 수있는만큼 중요하지 않습니다. 일반적으로 문제는 COM 인터페이스로 코드를 완료하고 누군가가 코드를 릴리스하는 것을 잊어 버렸기 때문에 발생합니다 (예 : Winword). 호출 된 관리 응용 프로그램이 종료 된 후에도 메모리가 손실됩니다.

같은 도구가 존재하지 않는 경우 (기술?) 이유는 무엇인가? COM interop을 사용하여 작업 할 때 많은 문제를 찾기가 매우 어려울 경우 매우 유용합니다.

답변

0

당신이 찾고있는 답변은 (또는 간단하지만) ReleaseCOMObject (래핑하는 네이티브 릴리스와 마찬가지로)는 남아있는 미해결 참조 수를 나타내는 정수를 반환합니다. 당신이 다음 릴리스 새로운 수를 확인하고 볼 수 있도록 당신이 기대하는 것입니다 경우을 명시 적으로 AddRef에 할 프로젝트에 코드를 추가 할 수 있습니다 등

다음
+0

전혀 걸림의 원인 예를 들어, "기차"속성 액세스가 발표 될 각 인스턴스를 필요로하는 열거를 사용하거나 잊어 예를 들어 때 도움이되지 않음 document.Sections [0] .Ranges [0] .Text. – Marek

+0

나는 그것이 당신이 찾고있는만큼 깨끗하지 않거나 간단하지 않다는 것을 인정한다. 하지만 AddRef에와 릴리스로 서브 루틴을 만들고, 반환 값을보고하고, 이전과 객체의 모든 사용 후이라고하면 (또는 의심 그냥 사람, 노력을 줄이기 위해), 당신은 더 좋아질 것 무슨 일이 일어나고 있는지 그림. 예를 들어, 열거자를 사용하기 전후에이 작업을 수행 한 경우 해당 코드의 내용에서 참조를 남기고 있는지 확인할 수 있습니다. –

관련 문제