2011-11-11 65 views
2

我在VS2010中调试我的C++ Win32程序,并且总是得到“Windows在program.exe中触发了一个断点”。Windows已经生成了一个断点

我已经重复检查,三重检查和四重检查代码。我找不到任何它应该发生的原因。但它每次都发生在同一个点上,所以一定有什么东西。有很多涉及的代码(构造函数,析构函数,窗口消息,内存分配和释放等等),所以很难在这里放置具体的东西,但是同时我明白没有代码你真的不能做太多的解释。

基本上只需点击一个按钮,就会显示一个显示图像的窗口。如果满足某个条件,我发送一个WM_DESTROY到该窗口并删除触发析构函数的变量,该函数在我的LPPICTURE上调用Release(),并将释放的变量设置为NULL

然后,当用户再次点击该按钮,它会尝试动态分配一个新的实例(在以前一样完全相同的方式),这就是产生断点的位置。 AFAIK(我一直试图调试这个超过一个小时),构造函数甚至没有启动。它似乎正在破坏动态内存分配的new()函数。

据我所知道的,它打破了上return HeapAlloc(_crtheap, 0, size ? size : 1);这是行54或malloc.c

什么奇怪的是,当我运行exe VS2010之外,一切都将继续正常。该程序不会崩溃,并继续按预期工作!

回答

6

不看代码就很难诊断,但根据您的描述,这听起来像堆腐败。我的猜测是,HeapAlloc检测到腐败,并产生一个int 3这将实质上触发调试器中的断点。我的建议是检查所有的对象分配/释放,并确保你没有踩到你没有分配(或已经释放)的内存。

此外,您提到您正在发送明确的WM_DESTROY消息。通常情况下,你想要让Windows生成WM_DESTROY消息要告诉你,无论是通过调用DestroyWindow,或通过发送WM_CLOSE到窗口,让DefWindowProc通话DestroyWindow你。这可能与您的问题无关,但仅供参考。

+1

+1这可能很好。在窗口处理假WM_DESTROY后,当窗口被正确销毁时,它很可能会得到另一个窗口。 @Ozzah永远不要生成'WM_DESTROY'。系统生成它并处理它。 –

+1

相关链接:http://blogs.msdn.com/b/oldnewthing/archive/2011/09/26/10216420.aspx –

+0

我检查了我的代码,我没有发送'WM_DESTROY',我打电话给'DestroyWindow (HWND)'。我意识到这很困难,但确实有很多可能相关的代码。我会再一次长时间仔细地看一遍,看看我能不能指出它。 – Ozzah

-1

我认为问题是,如果在Visual Studio中的调试,你必须把需要的文件(在这种情况下,你所谈论的图像)文件中某个目录中的debug文件夹,程序崩溃(同时被调试)因为它没有找到该文件,因此当您运行VS2010外的exe它不崩溃

+0

我不知道该说些什么,除了“大声笑” – Ozzah

+0

那么为什么它在视觉工作室之外完美运行,它真的发生在我身上,当我加载图像时,它完全在VS外运行,但在调试时崩溃并将图像放入内部调试目录解决了这个问题(有两个调试文件夹) – andrewmag

+0

对于初学者,我使用'OPENFILENAME'从任意路径加载图像,因此路径完全不相关。如果它只能将图像加载到同一个工作目录中,将会很不方便。其次,在我原来的问题中,我确实说过,在堆上分配时会触发断点 - 在遥远的将来,对图像做任何事情的代码都会发生。我很确定这是一个INT 3中断,当程序没有在调试器中运行时,它应该对用户完全不可见。 (确认?)只能看到像后来崩溃的副作用。 – Ozzah

2

根据我的经验,当出现这种情况,你有一堆校正/无效指针使用。断点发生在检测到故障的位置。这几乎从来都不是真正的失败 - 问题早就发生了。这些类型的断点只出现在调试器中。很多时候,腐败不是致命的,甚至可以通过其他行动来解决。

在任何情况下,你应该考虑appverifier,看是否能找到问题所在。一定要使用堆检查选项。

+0

好的,谢谢。当试图缩小问题时,这将有很大帮助:) – Ozzah

相关问题