2008-10-10 5 views
1

C# 라이브러리 모듈에서 힙 손상 오류가 발생합니다. C++ 응용 프로그램에서 COM을 통해 호출하고 있습니다.C# 클래스 라이브러리에서 힙 오류를 디버깅하려면 어떻게해야합니까?

HEAP : 특정 오류 버그가
해방 후 4b61be8에서 수정 4b61bb8 무료 힙 블록 ...
이 힙의 손상에 기인 할 수 있으며 나타낸다 [ app] .exe 또는로드 한 DLL 중 하나를 선택하십시오.

호출 스택의 상단은 다음과 같습니다

CustomMarshalers.dll!System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext() + 0x168 bytes 

이제 나의 이해는 .NET을 해결하는 것은 불가능했다 더 많은 메모리 문제가되지, 메모리 문제를 완화하기로 한 것이 었습니다. 그러나 나는 기억 상실을 야기 할 수있는 일이나 내가 그것을 고치려고 시도하는 방법을 생각할 수 없다. 특정 모듈은 Microsoft.VisualStudio.VCProjectEngine .NET 구성 요소를 사용하여 VC 프로젝트 파일을 매우 단순한 반복자로 반복합니다. 이전 약 100 건의 호출을 성공한 후 VCProject 필터 (폴더)에서 파일을 반복하는 동안 foreach 문을 위반합니다. 실제 코드는 다음과 같습니다.

IVCCollection CollectionFiles = (IVCCollection)FolderInProject.Files; 
    foreach (VCFile File in CollectionFiles) 
    { 
     [...] 
    } 

어떻게 디버깅 할 수 있습니까?

는 업데이트 : 순수한 C# 콘솔 응용 프로그램에서 경우 호출 할 때

은 (어떤 COM 또는 네이티브 코드가 포함되지), 내가 얻을 :

유형의 처리되지 않은 예외 'System.AccessViolationException' [구성] .dll에서 발생했습니다.

추가 정보 : 쓰기 보호 된 메모리를 읽으려고 시도했습니다. 이것은 종종 이고 다른 메모리는 입니다.

아직 디버깅 방법에 대한 단서가 없습니다. 분명히 어딘가에 메모리 오류가 발생합니다 ...하지만 메모리 모델이 노출되지 않은 순수 관리 코드에서 어떻게 추적 할 수 있습니까?

+0

COM 모듈 용 PIA를 만들었습니까? 아니면 미리 빌드 된 PIA를 사용 했습니까? – user7116

+0

PIA 란 무엇입니까? 그게 당신이 요구하는 것이라면 공용 인터페이스를 구축합니다. 빌드 및 COM 개체를 성공적으로 전에 사용한 및이 즉시 작동하는 경우 작동합니다; VC .NET 개체를 사용하는 동안에 만 실패합니다. 또한, 내 followup을 참조하십시오. – Nick

+0

PIA : http://msdn.microsoft.com/en-us/library/aax7sdch(VS.80).aspx – user7116

답변

1

COM 인터페이스가 매개 변수/반환 변수를 제대로 마샬링하지 않아 일부 관리되지 않는 마샬링으로 인해 GC 또는 관리되지 않는 메모리가 예기치 않게 freeedd 될 수 있습니다. COM 구성 요소에 대해 Primary Interop Assembly을 직접 작성하여 작성된 COM 인터페이스에 대해 좀 더 세분화 된 제어를 얻을 수 있습니다. 약간의 작업을 통해 COM 개체에서 문제가되는 메서드를 검사하고 모든 매개 변수에 올바른 메타 데이터가 있는지 확인하여 올바르게 정렬되었는지 확인할 수 있습니다.

이제는 모든 것을 제대로 마샬링하고 있지만 인터페이스를 올바르게 호출하지 않아서 매개 변수를 부적절하게 사용하여 관리되지 않는 메모리를 완전히 비우는 것으로 나타납니다. 특히 COM 소스에 대한 액세스 권한이없는 경우 추적하기가 쉽지 않습니다.

트릭은 프로그램이 디버거 외부에서 충돌하는 것을 허용하기 위해 디버그를 클릭하면 JIT 디버거 선택 창이 나타납니다.그런 다음 '디버깅 엔진 선택'(또는 그 취지)을 선택하고 관리 및 네이티브 확인란이 모두 선택되어 있는지 확인하십시오. 발생하는 VS 인스턴스는 사망 한 가장 가까운 관리 코드가 아니라 실제 사망 한 코드에서 파손되어야합니다.

+0

나는 그것이 COM 부분이라고 생각하지 않는다. 내 테스트 콘솔 앱 사용에는 COM 사용이 없습니다. Visual Studio 자동화 클래스와 관련이 있다고 생각하지만 디버깅 방법을 모릅니다. – Nick

+0

더 나은 콜 스택을 얻기 위해 크래시 트릭을 시도 했습니까? – user7116

관련 문제