用户断点无处可去

时间:2008-12-22 02:01:11

标签: c++ debugging visual-c++ vc6

我正在调试MS VC ++ 6.0中的一些代码。出于某种原因,在我想要删除一些动态分配的内存的某个点上,它会中断并且我得到一个弹出消息框,说“用户断点从代码中调用等等”,然后出现反汇编窗口,然后我弹出见

*memory address* int      3

奇怪的是,代码中有NOWHERE我正在调用这样的汇编指令(我认为asm int 3是x86的硬件中断命令吗?)..

是什么导致了这个?

编辑:解答:我的代码是“走出末端”的数组,但只在Visual Studio调试标记的位置使用0xFDFDFDFD,这被称为NoMan'sLand栅栏..我认为它也称为关闭一个错误..这个数组与我在发生错误时释放内存的点无关。这使得发现更难.. :(

2 个答案:

答案 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)中附近?