我正在调试MS VC ++ 6.0中的一些代码。出于某种原因,在我想要删除一些动态分配的内存的某个点上,它会中断并且我得到一个弹出消息框,说“用户断点从代码中调用等等”,然后出现反汇编窗口,然后我弹出见
*memory address* int 3
奇怪的是,代码中有NOWHERE我正在调用这样的汇编指令(我认为asm int 3是x86的硬件中断命令吗?)..
是什么导致了这个?
编辑:解答:我的代码是“走出末端”的数组,但只在Visual Studio调试标记的位置使用0xFDFDFDFD,这被称为NoMan'sLand栅栏..我认为它也称为关闭一个错误..这个数组与我在发生错误时释放内存的点无关。这使得发现更难.. :(
答案 0 :(得分: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
将是您要删除的指针的值。
答案 1 :(得分:3)
(我认为asm int 3是硬件中断 命令x86?
是。它被称为“硬件断点”。如果您将VS调试器与项目源代码一起使用,它就像一个断点(但在代码中)。从vs2005开始,如果您的应用程序在没有任何调试器的情况下启动,那么应用程序就会崩溃,就好像它启动了一个非托管异常一样。
在很多公司中,有一个简单的宏用于在代码中添加断点。这可以替代某些(困难和罕见)情况下的断言和异常:
#define BREAKPOINT __asm { int 3; }
BREAKPOINT;
见:
所以我建议寻找一些宏或对象这样做,或者它可能在一个你没有代码的模块(dll / lib)中附近?