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

本文介绍了解决VC++程序在Debug模式下正常运行,但在Release模式下崩溃的问题。通过调整消息处理函数定义或消息映射表可以有效避免由于参数不匹配导致的崩溃现象。

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

--《VC编程知识总结》之三

    在调试程序的时候经常遇到一个问题: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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值