2010-07-04 5 views
1

동적으로로드 된 & 언로드 DLL에서 COMCTL32.dll> = v6.0 및 MSVCR> = v9.0이 필요합니다. 올바른 버전이로드되었는지 확인하기 위해, 나는 비주얼 스튜디오 프로젝트 설정에서 매니페스트 파일 생성을 가능하게하고, 다른 매니페스트 파일에이 항목을 추가 : 그 FreeLibrary() 다음에 내가 LoadLibrary() 전화 테스트 프로그램에서활성화 컨텍스트에 의해 동적으로로드 된 DLL에서 파일 핸들 누수가 발생했습니다.

<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>

  • C : \ WINDOWS \ WinSxS에 \ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
  • C : \ WINDOWS \ WinSxS에 \ x86_Microso DLL 및 ProcessExplorer는 다음과 같은 파일 핸들이 유출되었음을 나타냅니다 ft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83 분해 호출 스택 추적에서

나는 LoadLibrary()에 활성화 컨텍스트를 자동으로 생성하고 해당 폴더의 각 핸들을 여는 것을 배웠다. 그러나 활성화 컨텍스트는 FreeLibrary()에서 삭제되지 않는 것으로 보입니다.

매니페스트 파일을 제거하고 프로젝트 설정을 설정하여 매니페스트 생성을 사용하지 않으면 이러한 누출이 사라집니다. 그러나이 방법으로이 DLL을 제어 할 수없는 프로세스에서로드하므로 올바른 MSVCR 및 COMCTL을 사용할 수 없습니다.

매니페스트 파일을 제거하지 않고이 누설을 제거하는 방법이 있습니까? ?

감사합니다.

답변

1

ProcessExplorer HANDLE 누출 보고서는 활성화 컨텍스트 누출의 증상입니다. 대부분이 누설은 MFC를 올바르게 호출하지 못했다는 점에서 간접적으로 코드에 있습니다.

자신이 MFC가 아니라 사용자의 버그인지 확인하려면 코드없이 응용 프로그램에서 간단한 MFC DLL을 만들고 LoadLibrary/FreeLibrary 때 누적 누수가 없는지 확인하십시오.

누락 된 OS 호출은 ReleaseActCtx이거나 누락 된 DeactivateActCtx로 인해 릴리스가 실패합니다. 실제로, MFC는 당신을 위해 이러한 함수를 호출하므로 어떤 종류의 누락 된 MFC 호출을 찾을 수 있습니다.

가장 좋은 디버깅 기술은 핵심 활성화 컨텍스트 인 create/activate/deactivate/release 함수를 추적하거나 중단하는 것입니다 (http://msdn.microsoft.com/en-us/library/aa374166(VS.85) .aspx) 무슨 일이 일어나는 지보십시오. 어떤 종류의 추적이 필요할 수 있으므로 여러 개의 호출이 표시 될 수 있습니다. 이상적으로는 각 호출에서 호출 스택을 캡처하여 검토 할 수 있습니다. 디버거가이를 도와 줄 수 있습니다.최신 버전의 VS는 중단 점에 도달 할 때 매크로를 실행할 수 있습니다.

매니페스트 파일이 필요하며이를 제거하면 안됩니다.

마틴

0

이러한 핸들은 캐싱 된 그대로 누출되지 않을 수 있습니다. DLL을 여러 번 반복해서로드하고 언로드하도록 테스트 프로그램을 변경하면 DLL이 언로드 될 때마다 새 핸들 쌍이 누수되는 것을 볼 수 있습니까? 그렇지 않은 경우 문제가되지 않습니다.

+0

답변 해 주셔서 감사합니다. 이전에, 그리고 모든 LoadLibrary - FreeLibrary 쌍에 대해, ProcessExplorer에 표시된 두 개의 새로운 파일 핸들이 있습니다. 나는 다른 시점에 프로세스 데이터를 저장하고 확실하게 비교했다. – edwinbs

0

혹시 DLL이 MFC를 사용합니까? MFC를 사용하는 DLL에 문제가있어서 AfxWinInit()이 관련 될 수 있습니다. 이 DLL (잘못) AfxWinInit() 반복적으로 호출하고 각 호출에 대한 활성화 컨텍스트가 누수가 밝혀졌습니다. 놀랍게도 이것은 호출 응용 프로그램이 매니페스트를 사용했을 때만 발생했습니다.

1

ProcessExplorer 제어력 보고서 활성화 컨텍스트 누설의 증상이다. 대부분이 누설은 MFC를 올바르게 호출하지 못했다는 점에서 간접적으로 코드에 있습니다.

특정 코드 사용과 관련이 없습니다. 이 문제는 Microsoft에서 확인한 것입니다. http://support.microsoft.com/kb/2624911

Windows Vista 이상에 영향을주는 UnregisterClass를 호출 할 때 실제로 SHELL32.DLL에서 컨텍스트 활성화 누출이 있습니다. 문제를 해결할 수있는 유일한 방법은 반복적으로 SHELL32.DLL을로드 및 언로드하지 않는 것입니다. Microsoft는 최신 버전의 Windows에서이 문제점에 대한 해결책을 찾고 있습니다.

관련 문제