我正在调试MS VC++ 6.0中的一些代码.出于某种原因,在我想要删除一些动态分配的内存的某个点上,它会中断并且我得到一个弹出消息框,说"用户断点从代码中调用等等",然后出现反汇编窗口,然后我弹出看到
*memory address* int 3
奇怪的是,代码中有NOWHERE,我正在调用这样的汇编指令(我认为asm int 3是x86的硬件中断命令?)..
可能是什么导致了这个?
编辑:答案:我的代码是"走出末端"的数组,但只在Visual Studio调试标记的位置使用0xFDFDFDFD,这被称为NoMan'sLand栅栏..我认为它也称为Off-by-一个错误..这个数组与我在发生错误时释放内存的点无关.这使得发现更难.. :(
您可能在已发现堆损坏的调试堆例程中遇到代码.
当你击中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
将是您要删除的指针的值.