题
我正在调试 MS VC++ 6.0 中的一些代码。出于某种原因,在我尝试删除一些动态分配的内存的某个时刻,它崩溃了,我收到一个弹出消息框,上面写着“从代码中调用的用户断点等等”。然后弹出反汇编窗口,我看到
*memory address* int 3
奇怪的是,代码中没有任何地方我调用这样的汇编指令(我认为 asm int 3 是 x86 的硬件中断命令?)..
可能是什么原因造成的?
编辑:回答:我的代码“走出数组的末尾”,但仅限于 Visual Studio 调试用 0xFDFDFDFD 标记的位置,这被称为 NoMan'sLand 栅栏。我认为它也称为“差一错误”。该数组与错误发生时我释放内存的点无关。这使得更难发现..:(
解决方案
你可能打码在已经发现堆损坏的调试堆例程。
这是什么调用堆栈看,当你打到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
将是您的delete一个指针的值。
其他提示
(我认为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)中?
不隶属于 StackOverflow