invalidOverlappedToPinvoke MDA

更新 : 2007 年 11 月

invalidOverlappedToPinvoke マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、ガベージ コレクション ヒープで作成されていないオーバーラップ ポインタが特定の Win32 関数に渡されるとアクティブになります。

ms228991.alert_note(ja-jp,VS.90).gifメモ :

既定では、この MDA は、プラットフォームの起動の呼び出しがコードで定義され、デバッガが各メソッドの JustMyCode 状態をレポートする場合にのみアクティブになります (「方法 : マイ コードのみにステップ インする」を参照)。JustMyCode を理解しないデバッガ (拡張機能なしの MDbg.exe など) は、この MDA をアクティブにしません。このようなデバッガに対してこの MDA を有効にするには、構成ファイルを使用し、.mda.config ファイルで justMyCode="false" を明示的に設定します(<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>)。

症状

クラッシュまたは説明のつかないヒープ破損。

原因

ガベージ コレクション ヒープで作成されていないオーバーラップ ポインタが特定のオペレーティング システム関数に渡されています。

この 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>

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute