0

VS2008 を使用して GPF (ACCESS VIOLATION) をデバッグしています。EIP をクラッシュ アドレスに設定すると、ソース コードの一部が適切に表示されます。GPF の原因ではないようです。

私は8コアマシンを使用しています。そのようなものに複数のCS:EIPレジスタがありますか? その場合、Visual Studio でそれらにアクセスするにはどうすればよいですか?

どうもありがとう!

4

2 に答える 2

1

一般保護違反 (GPF) は、あらゆる種類の無効なメモリ アクセスによって発生する可能性があります。無効なメモリアドレスで命令を実行しようとするだけでなく、命令が使用する無効なメモリアドレスでオペランドにアクセスしようとすることによっても発生します。例えば、

mov [eax], ebx

eax に格納されている値が NULL の場合、GPF が発生します (従来のヌル ポインターの逆参照)。Visual Studio デバッガーが特定の命令アドレス (CS:EIP) を示し、そのアドレスにコードが見つかった場合、エラーの理由は、その命令で使用されるメモリ オペランドのアドレスになります。デフォルトでは、Visual Studio は、障害のあるスレッドのコンテキストで情報を提供します。したがって、別のスレッド コンテキストを調べる理由はありません。

例えば: ここに画像の説明を入力

次に、Debug->Windows->Disassembly を開くと、次の図が表示されます。 ここに画像の説明を入力

ご覧のとおり、GPF は eax に格納された無効なアドレスによって上昇しました。最初の画像のメッセージ ボックスに示されているエラーのある命令アドレス 0x012b1002 は、2 番目の画像のデバッガーによって示されているものと同じです。最初の画像のフォルト アドレス 0x00000000 は、eax に格納されたアドレスであり、mov 命令でメモリ位置パラメータとして使用されます。

于 2012-12-06T06:37:02.753 に答える