どこからともなくユーザー ブレークポイントが出現
-
23-08-2019 - |
質問
MS VC++ 6.0 にデバッグ中のコードがいくつかあります。何らかの理由で、動的に割り当てられたメモリを削除しようとしている特定の時点でメモリが壊れ、「ユーザー ブレークポイントがコードから呼び出されました」というポップアップ メッセージ ボックスが表示されます。次に、「逆アセンブリ」ウィンドウがポップアップ表示され、
*memory address* int 3
奇妙なことに、コードのどこにもこのようなアセンブリ命令を呼び出しているところがありません (asm int 3 は x86 のハードウェア ブレーク コマンドだと思います)。
何が原因でしょうか?
編集:答え:私のコードは配列の「端から出て」いましたが、Visual Studio のデバッグで 0xFDFDFDFD でマークされた場所のみでした。これは NoMan'sLand フェンスと呼ばれます。Off-by-oneエラーとも呼ばれると思います。この配列は、エラーが発生したときにメモリを解放していた点とは無関係でした。そのせいで発見が難しくなりました。:(
解決
あなたはおそらく、ヒープの破損を発見したデバッグヒープルーチンのコードを打っています。
あなたが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
あなたがdeleteingしているポインタの値になります。
他のヒント
(ASM Int 3はX86のハードウェアブレイクコマンドだと思いますか?
そうです。 それは呼ばれています 「ハードウェアブレークポイント」. 。プロジェクトのソース コードで VS デバッガーを使用している場合、これはブレークポイントと同じです (ただしコード内にあります)。vs2005 以降、デバッガーなしでアプリケーションを起動すると、アンマネージ例外を起動した場合と同様に、アプリケーションは単純にクラッシュします。
多くの企業では、コードにブレークポイントを追加するために使用される単純なマクロがあります。これは、いくつかの (困難でまれな) 場合にアサートと例外を置き換えることができます。
#define BREAKPOINT __asm { int 3; }
BREAKPOINT;
見る :
- http://msdn.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx
- http://www.highprogrammer.com/alan/windev/visualstudio.html
したがって、これを行うマクロまたはオブジェクトを探すことをお勧めします。それともコードを持っていないモジュール(dll/lib)に追加するのでしょうか?