我在MS VC++ 6.0中有一些正在调试的代码。由于某些原因,在我试图删除一些动态分配的内存时,它崩溃了,并且我得到了一个弹出的消息框,上面写着"User Breakpoint called from code from code at blah blah“。然后弹出反汇编窗口,我看到
*memory address* int 3奇怪的是,我在代码中没有这样调用汇编指令的地方(我认为ASMint3是x86的硬件中断命令)。
这可能是什么原因造成的?
编辑:答案:我的代码是“走出”数组的末尾,但只在Visual Studio debug用0xFDFDFDFD标记的位置,这被称为诺曼的陆地栅栏。我认为这也被称为Off-by-one错误..这个数组与错误发生时我正在释放内存的点无关。这使得它更难被发现..:(
发布于 2008-12-22 02:02:46
您可能会遇到发现堆损坏的调试堆例程中的代码。
当你点击Int3时,调用堆栈是什么样子的?
编辑:根据您评论中的堆栈跟踪,例程_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-22 02:13:17
(我认为asm int3是x86的硬件中断命令?
就是这样。它被称为“硬件断点”。如果您在项目源代码中使用VS调试器,它就像一个断点(但在代码中)。由于vs2005,如果您的应用程序是在没有任何调试器的情况下启动的,则应用程序将简单地崩溃,就像它启动了非托管异常一样。
在许多公司中,有一个简单宏用于在代码中添加断点。可以在某些(硬的和罕见的)情况下替换断言和异常:
#define BREAKPOINT __asm { int 3; }
BREAKPOINT;请参见:
所以我建议寻找一些宏或对象来做这件事,或者可能它附加在一个你没有代码的模块(dll/lib)中。
https://stackoverflow.com/questions/385370
复制相似问题