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

转载 2013年12月23日 08:36:04
在调试程序的时候经常遇到一个问题: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

VC下发布的Release版程序崩溃后的异常捕捉与查找

寻找Release版程发生异常退出的地方比Debug版麻烦得多。发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概的出错信息,然后可以用以下办法分析我们的程...
  • nokianasty
  • nokianasty
  • 2013年01月15日 10:17
  • 7454

今天解决了的一个DEBUG运行正常RELEASE出错的问题!

今天正在做一个项目,进展顺利,但是编译成RELEASE版本运行却发现错误.自己弄了半天也没搞定.但最后还是看了一篇文章解决了.主要原因是因为DEBUG和RELEASE在解决函数掉用上的方式的不同.DE...
  • likexin
  • likexin
  • 2007年10月02日 16:03
  • 13409

一个Debug版本不崩而Release版本可能崩的问题

一个Debug版不崩而Release版可能崩的问题
  • zhulong20120418
  • zhulong20120418
  • 2016年01月14日 14:41
  • 618

Debug系列:VC++程序Release版崩溃的解决办法

from: http://rendao.org/blog/1999/ Debug系列:VC++程序Release版崩溃的解决办法 VC++程序发布后,如果在客户那运行崩溃,且研发环境下无法本地...
  • eatjpg
  • eatjpg
  • 2015年09月22日 14:02
  • 326

vs下debug运行正常,release下出现异常

VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方...
  • xietingcandice
  • xietingcandice
  • 2013年06月13日 15:07
  • 2272

Debug版本下能运行而Release下不能运行的问题总结

引言      如果在您的开发过程中遇到了常见的错误,或许您的Release版本不能正常运行而Debug版本运行无误,那么我推荐您阅读本文:因为并非如您想象的那样,Release版本可以保证您的应用...
  • puppet_master
  • puppet_master
  • 2015年10月08日 14:33
  • 3242

VC中debug和release版本的区别

vc中debug和release的不同 收藏  在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是...
  • hegeneral
  • hegeneral
  • 2016年04月27日 20:15
  • 2232

程序在Debug、Release下运行及单独运行Debug下的exe文件时没有问题;可是单独运行Release所生成的exe文件时,点击某一个按钮时,程序崩溃

 遇到一个很纠结的问题,程序在Debug下运行时没有问题,直接运行生成的exe文件也没有问题;在release下,直接在VS2010中运行时也没有问题,可是运行release所生成的exe文件时...
  • u014023993
  • u014023993
  • 2014年06月26日 14:52
  • 1194

Debug下正常,而Release失败的原因

关于Debug和Release之本质区别的讨论  一、Debug 和 Release  编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程...
  • encoder1234
  • encoder1234
  • 2016年11月29日 13:50
  • 1354

Debug下正常,而Release失败的原因

关于Debug和Release之本质区别的讨论  一、Debug 和 Release  编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。...
  • qq_28796345
  • qq_28796345
  • 2016年06月03日 00:07
  • 2671
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC在debug运行正常,release崩溃的解决办法
举报原因:
原因补充:

(最多只允许输入30个字)