バグ チェック 0x18: REFERENCE_BY_POINTER
REFERENCE_BY_POINTER バグ チェックには、0x00000018の値があります。 これは、オブジェクトの現在の状態に対してオブジェクトの参照カウントが無効であることを示します。
重要
この記事は、プログラマー向けです。 コンピューターを使用中に、ブルー スクリーン エラーが表示された場合は、「ブルー スクリーン エラーのトラブルシューティング」を参照してください。
REFERENCE_BY_POINTER パラメーター
パラメーター | 説明 |
---|---|
1 |
参照カウントを下げようとしているオブジェクトのタイプ。 |
2 |
参照カウントが下がっているオブジェクト。 |
3 |
予約済み |
4 |
予約済み |
原因
オブジェクトの参照カウントは、オブジェクトの現在の状態では無効です。 ドライバーがオブジェクトへのポインターを使用するたびに、ドライバーはカーネル ルーチンを呼び出して、オブジェクトの参照カウントを 1 ずつ増やします。 ドライバーがポインターで完了すると、ドライバーは別のカーネル ルーチンを呼び出して、参照カウントを 1 ずつ減らします。
ドライバーは、参照カウントを増加 (参照) および減少 (逆参照) ルーチンの呼び出しと一致させる必要があります。 このバグ チェックは、オブジェクトの参照カウントの不整合が原因で発生します。 通常、この不整合は、ドライバーがオブジェクトの参照カウントを減らしすぎて、オブジェクトを逆参照する余分な呼び出しを行ったために発生します。 このバグ チェックは、オブジェクトへのハンドルがまだ開いている間に、オブジェクトの参照カウントが 0 になるため発生する可能性があります。 また、オブジェクトへの開いているハンドルがあるかどうかに関係なく、オブジェクトの参照カウントが 0 を下回った場合にも発生する可能性があります。
解決方法
ドライバーがオブジェクトの参照カウントを増減するルーチンの呼び出しと一致することを確認します。 ドライバーがオブジェクトを逆参照するルーチンを追加で呼び出さないことを確認します (パラメーター 2 を参照)。
デバッガーを使用して、この問題の分析に役立てることができます。 詳細については、「(Windows デバッガーを用いたクラッシュ ダンプ分析 (WinDbg)) を参照してください。 !analyze デバッグ拡張コマンドは、バグ チェックに関する情報を表示し、根本原因の特定に役立ちます。
オブジェクトのハンドルとポインターの数を検索するには、!object デバッガー コマンドを使用します。
kd> !オブジェクト アドレス
ここで 、アドレス はパラメーター 2 で指定されたオブジェクトのアドレスです。
また、この停止コードの前にあるコードにブレークポイントを設定し、エラーが発生したコードへのシングル ステップ フォワードを試行することもできます。
Windows デバッガーを使用してこの問題に取り組む機能がない場合は、いくつかの基本的なトラブルシューティング手法を使用できます。
イベント ビューアーのシステム ログで、このバグ チェックの原因になっているデバイスまたはドライバーの特定に役立つ可能性がある追加のエラー メッセージを調べます。
バグ チェック メッセージでドライバーがわかる場合は、ドライバーを無効にするか、製造元にドライバーの更新プログラムを確認します。
インストールされた新しいハードウェアが、インストールされている Windows のバージョンと互換性があることを確認します。 たとえば、 Windows 10 の仕様で必要なハードウェアに関する情報を取得できます。
その他の一般的なトラブルシューティング情報については、バグ チェックのブルー スクリーン データの分析に関する記述を参照してください。