2011-11-29 2 views
1

프로젝트에서 .EXE 서버의 개체 (개체가 캐시해야하는 비싼 쿼리를 수행함)와 이야기하고 있는데 참조 수가 잘못 계산 된 것 같습니다. 서버 프로세스는 여전히 참조를 보유하고있는 객체를 해제하여 호스트 프로세스가 데이터 유실 및 공급 업체에 버그 보고서 전송과 관련된 흥미롭고 흥미로운 방식으로 실패하게 만듭니다.COM 참조 카운터 디버깅

refcount가 0으로 떨어지는 프록시 개체가 어떤 식 으로든 사용되는 경우 디버거에서 탐지 할 수있는 조건을 COM에서 발생하도록 COM에 요청할 수있는 방법이 있습니까?

+0

예기치 않은 이유로 클라이언트 프로세스가'IUnknown :: Release'을 추가로 수행하는 경우 실제 응용 프로그램으로 전달되지 않을 것입니다. 대신 서버 프로세스 스텁은 실제 개체에서 참조 횟수를 올바르게 관리하지만 프록시는 프록시를 파괴합니다. –

+0

네, 그게 제가 기대할 수있는 것입니다. 그러나 서버 응용 프로그램이 어떤 객체의 참조 카운트가 부정적으로 된 창을 팝업 할 수 있습니다. –

+0

더 많은 가능성이 있습니다, 당신이 그것을 사용하는 방법을 기대하지 않는 버그가 많은 서버입니다. 예를 들어 진행 중에 메인 오브젝트를 일시적으로 참조하는 백그라운드 작업자 활동과 같이 최상위 레벨 참조 카운트에 영향을 미치는 내부 COM 오브젝트가있을 수 있습니다. –

답변

0

원시 인터페이스를 사용하면 가능하지 않을 것입니다. 참조 횟수는 COM 서버에서 유지 관리되며 구현 방법은 서버에 달려 있습니다. 구현은 서버 코드 안에 있으므로 소스와 캔이없는 한 서버를 디버그하면 얻을 수있는 방법이 없습니다.

그러나 AddRef 및 Release를 수동으로 호출하여 문제가 발생할 가능성이 있습니다. 이 경우 RAII/스마트 포인터 솔루션을 사용할 수 있습니다. ATL은 하나를 제공하지만, 어떤 이유로 든 그것을 사용할 수 없다면, 자신의 것을 쉽게 만들 수 있습니다. 그런 다음 제공된 카운팅을 추적하기 위해 제공된 디버깅 기능을 만들거나 사용할 수있을뿐만 아니라 처음부터 잘못 이해할 가능성이 훨씬 적습니다.

+0

서버가 out-of-process이므로 내 주소 공간에있는 개체가 프록시라는 보장을받습니다. 따라서 디버깅을 위해이 사실을 사용할 수 있기를 바랍니다. –

+0

필자는 필사적이라면 별도의 참조 카운트를 유지하고 레지스트리의 레지스트리를 대체 할 수있는 자신의 프록시 DLL을 제공 할 수 있지만 확실히 많은 작업이 필요하다고 생각합니다. – AndrzejJ