메모
이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.
invalidOverlappedToPinvoke 가비지 수집 힙에서 생성되지 않은 겹치는 포인터가 특정 Win32 함수에 전달되면 MDA(관리 디버깅 도우미)가 활성화됩니다.
메모
기본적으로 이 MDA는 플랫폼 호출 호출이 코드에 정의되어 있고 디버거가 각 메서드의 JustMyCode 상태를 보고하는 경우에만 활성화됩니다. JustMyCode를 이해하지 못하는 디버거(예: 확장이 없는 MDbg.exe)는 이 MDA를 활성화하지 않습니다. 이 MDA는 구성 파일을 사용하고 .mda.config 파일에서 명시적으로 설정하여 justMyCode="false" 해당 디버거에 대해 (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>사용하도록 설정할 수 있습니다.
Symptoms
충돌 또는 설명할 수 없는 힙 손상.
원인
가비지 수집 힙에서 생성되지 않은 겹치는 포인터는 특정 운영 체제 함수에 전달됩니다.
다음 표에서는 이 MDA가 추적하는 함수를 보여 줍니다.
| 모듈 | 기능 |
|---|---|
| HttpApi.dll | HttpReceiveHttpRequest |
| IpHlpApi.dll | NotifyAddrChange |
| kernel32.dll | ReadFile |
| kernel32.dll | ReadFileEx |
| kernel32.dll | WriteFile |
| kernel32.dll | WriteFileEx |
| kernel32.dll | ReadDirectoryChangesW |
| kernel32.dll | PostQueuedCompletionStatus |
| MSWSock.dll | ConnectEx |
| WS2_32.dll | WSASend |
| WS2_32.dll | WSASendTo |
| WS2_32.dll | WSARecv |
| WS2_32.dll | WSARecvFrom |
| MQRT.dll | MQReceiveMessage |
호출을 언로드할 수 있으므로 AppDomain 이 조건에서는 힙 손상 가능성이 높습니다. AppDomain 언로드하는 경우 애플리케이션 코드는 겹치는 포인터에 대한 메모리를 해제하여 작업이 완료되면 손상되거나 코드가 메모리를 누수하여 나중에 문제가 발생합니다.
해결 방법
메서드를 Overlapped 호출하여 함수에 Pack 전달할 수 있는 NativeOverlapped 구조를 가져오는 개체를 사용합니다. AppDomain 언로드하는 경우 CLR은 포인터를 해제하기 전에 비동기 작업이 완료될 때까지 기다립니다.
런타임에 미치는 영향
이 MDA는 CLR에 영향을 주지 않았습니다.
출력
다음은 이 MDA의 출력 예제입니다.
An overlapped pointer (0x00ea3430) that was not allocated on the GC heap was passed via Pinvoke to the Win32 function 'WriteFile' in module 'KERNEL32.DLL'. If the AppDomain is shut down, this can cause heap corruption when the async I/O completes. The best solution is to pass a NativeOverlapped structure retrieved from a call to System.Threading.Overlapped.Pack(). If the AppDomain exits, the CLR will keep this structure alive and pinned until the I/O completes.
구성 / 설정
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>
참고하십시오
.NET