社区
进程/线程/DLL
帖子详情
为何开了线程后,debug版运行正常,而release版运行出错
nanzihebei
2003-12-17 11:47:00
我在程序中开了两个线程,一个用来实现规划计算,一个用来判断规划计算是否结束,并在该线程中以发送消息的方式显示结果。
该程序debug版运行没有任何问题,而运行release版时,如果开了第二个线程则运行出错,求各位大侠相助!
...全文
176
6
打赏
收藏
为何开了线程后,debug版运行正常,而release版运行出错
我在程序中开了两个线程,一个用来实现规划计算,一个用来判断规划计算是否结束,并在该线程中以发送消息的方式显示结果。 该程序debug版运行没有任何问题,而运行release版时,如果开了第二个线程则运行出错,求各位大侠相助!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mldds
2003-12-17
打赏
举报
回复
是否与两个线程的执行顺序有关,比如共享数据的初试化等。
开两个线程,它们的启动顺序是没有保证的,与你调用线程启动函数的顺序无关,由操作系统决定。
nanzihebei
2003-12-17
打赏
举报
回复
果然是carbon107(<软件开发思想.h>) 所说的”自定义消息的消息参数“的问题,按大哥所说的修改后,果然就正常运行了。非常感谢!
好,给分了!
robinzo
2003-12-17
打赏
举报
回复
http://expert.csdn.net/Expert/topic/2398/2398277.xml?temp=.819195
osborn
2003-12-17
打赏
举报
回复
估计不是变量初始化问题,就是线程同步的问题。
贴代码吧!
carbon107
2003-12-17
打赏
举报
回复
1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧。
2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:
afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM
lparam); (注2)
3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
4. ASSERT, VERIFY, TRACE..........调试宏
这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为"#define ASSERT(f) ((void)0)"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。VERIFY是个例外,"#define VERIFY(f) ((void)(f))",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。
总结:
Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个避免的方面,即使没有这种问题也应注意一下:
1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
jimsleon
2003-12-17
打赏
举报
回复
能不能多提供一些信息?你现在提供的是在太少,我帮不上你,如果能贴一下两个线程函数的主干代码的话,我想可能可以帮上忙。不过根据经验,很可能是线程同步没做好,或者工程参数设置有问题
程序在
Debug
模式下
运行
正常而在
Release
模式下
运行
出错
的解决方案
背景 以前在网上查资料的时候,无意中
开
发别人出现过这样的一个问题:“程序在
Debug
模式下
运行
正常,而在
Release
模式下
运行
出错
”。当时就下意识认为,这不可能,肯定是代码有改动了!但,当自己写的一个小程序出现了这个问题后,才
开
始正式这个问题。 现在把当时解决问题的一些思路总结下,分享给大家,希望大家少走弯路吧。 分析过程 在VS
开
发环境中,
Debug
模式和
Release
模式并没有本质上的区别,...
Debug
下正常,而
Release
失败的原因
关于
Debug
和
Release
之本质区别的讨论 一、
Debug
和
Release
编译方式的本质区别
Debug
通常称为调试
版
本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release
称为发布
版
本,它往往是进行了各种优化,使得程序在代码大小和
运行
速度上都是最优的,以便用户很好地使用。
Debug
和
Release
的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(...
关于
Debug
版
正常
运行
,
release
版
运行
崩溃的问题
关于
Debug
版
正常
运行
,
release
版
运行
崩溃的问题 通常情况下,
Debug
版
用于程序的调试优化,尽可能将遇到的BUG找到并解决掉; 这样编译出的
Release
版
才可能有效可靠的
运行
。然而如果编译出的
Debug
版
程序正常
运行
, 而
Release
版
程序却不能正常
运行
或者崩溃。这种情况比较棘手。下面是经验只谈。 [1]定位。首先
Release
版
程序是可以进行调试的。尽管调试信息不如De
C++
debug
和
release
版
本的区别及调试技巧
一、
Debug
和
Release
编译方式的本质区别
Debug
通常称为调试
版
本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release
称为发布
版
本,它往往是进行了各种优化,使得程序在代码大小和
运行
速度上都是最优的,以便用户很好地使用。
Debug
和
Release
的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起
Release
版
错误,在此不讨论)
Debug
版
本:
Release
版
本: 实际
java
debug
release
_
Debug
和
Release
区别
VC下
Debug
和
Release
区别最近写代码过程中,发现
Debug
下
运行
正常,
Release
下就会出现问题,百思不得其解,而
Release
下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这 罗列汇总下,做为备忘~一、
Debug
和
Release
的区别
Debug
通常称为调试
版
本,它包含调试信...
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章