VC在debug运行正常,release崩溃的解决办法

在调试程序的时候经常遇到一个问题:debug版运行的很正常,查不出任何问题,到了release版,运行一会儿就崩溃了。最近一段时间查了很多资料,终于是找到了原因所在。讲解如下:

    遇到这种问题,要查查系统中是否定义了消息捕获和触发函数(我的程序就是这个问题),如果你的程序中没有定义消息,也没有定义消息捕获和触发函数,那就不好意思,我没有遇到这个问题,所以没有研究过,非常抱歉(你可以查看一下,是不是存在未初始化就使用的变量,因为debug中系统会帮助初始化,但release中不会)。如果有定义消息,请查看自己的消息处理函数定义,是不是定义成了afx_msg void OnXXXX(WPARAM wParam, LPARAM lParam),如果定义成这样,那就在消息处理方面不存在我要讲得问题,如果定义成了afx_msg void OnXXXX(),那就按照我说的方法改吧,应该就不会有问题了。

    修改方法有两种:

    1、将afx_msg void OnXXXX()改为afx_msg void OnXXXX(WPARAM wParam, LPARAM lParam)

    2、不修改函数定义,将消息映射表(Map)中的ON_MESSAGE(Message,MemberFunc)改为ON_MESSAGE_VOID(Message,MemberFunc)注意要包含头文件axfpriv.h

    问题原因:当有自定义的消息产生时,系统会调用自定义消息处理函数(就是MemberFunc),系统想当然的认为这个函数有两个参数,分别是WPARAM wParamLPARAM lParam。系统在调用函数时,会把这两个参数压栈,而函数自身并没有参数。在release优化的情况下,在返回上一级函数时,依据的是这个函数的自动变量,参数等信息,于是这两个参数被系统留了下来,这样就产生了冲突,所以程序就崩溃了。在debug下,每调用一个函数时,系统会把当前函数在堆栈中的位置保存在一个寄存器中(EBP),当函数执行完毕后返回上一级函数时,不会出现release时的冲突,所以不会出现问题。

 

PS:之前遇到这种问题,也有朋友说修改release的编译参数,去掉优化参数就可以,这个方法确实可以使release版运行正常,但我不建议使用,为了方便大家查找,我也列出来:将Project->Settings->C/C++->Project Options中的/O2改为/Od

阅读更多
个人分类: mfc
上一篇MFC最小化到系统托盘 MFC初始化时隐藏对话框
下一篇C++ 容器deque深入学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭