7

デバッグしているMSVC++6.0のコードがあります。何らかの理由で、動的に割り当てられたメモリを削除しようとしているこの特定の時点で、メモリが壊れ、「ユーザーブレークポイントがコードから呼び出されました」というポップアップメッセージボックスが表示されます。その後、逆アセンブリウィンドウがポップアップし、見る

*memory address* int      3

奇妙なことに、私がこのようなアセンブリ命令を呼び出しているコードには、NOWHEREがあります(asm int 3はx86のハードウェアブレークコマンドだと思いますか?)。

何がこれを引き起こしている可能性がありますか?

編集:回答:私のコードは配列の「終わりを離れて」いたが、NoMan'sLandフェンスと呼ばれる0xFDFDFDFDを使用したVisualStudioデバッグによってマークされた場所でのみ..オフバイバイとも呼ばれると思う1つのエラー..この配列は、エラーが発生したときにメモリを解放していたポイントとは無関係でした。それは見つけるのを難しくしました..:(

4

2 に答える 2

8

ヒープの破損を検出したデバッグヒープルーチンのコードにヒットしている可能性があります。

Int 3に到達したときのコールスタックはどのようになりますか?

編集:コメントのスタックトレースに基づいて、ルーチン_CrtIsValidHeapPointer()は解放されているポインターが不良であると言っています。MSVCのDBGHEAP.Cソースからのコードスニペットは次のとおりです。

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData削除するポインタの値になります。

于 2008-12-22T02:02:46.033 に答える
3

(asm int 3 は x86 のハードウェア ブレーク コマンドだと思いますか?

です。「ハードウェア ブレークポイント」と呼ばれます。プロジェクトのソース コードで VS デバッガーを使用している場合、これはブレークポイントのようなものです (ただし、コード内にあります)。vs2005 以降、アプリケーションをデバッガなしで起動すると、アンマネージ例外を起動した場合のように、アプリケーションは単純にクラッシュします。

多くの企業では、コードにそのブレークポイントを追加するために使用される単純なマクロがあります。一部の(ハードでまれな)ケースでは、アサートと例外を置き換えることができます:

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

見る :

したがって、これを行うマクロまたはオブジェクトを探すことをお勧めします。または、コードを持っていないモジュール (dll/lib) に追加することもできますか?

于 2008-12-22T02:13:16.540 に答える