关于VC2003的 debug 和 release模式

kevinlynx 2006-10-23 04:44:15
我主要写的是游戏程序,窗口处理方面用的是纯WINDOWS API,有时候会用STL,其他图形库应该没有影响!
问题在于,有时候程序在debug模式下会出现崩溃性错误!而release模式却没有这种错误!
不知道这是什么原因?
...全文
315 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnhgj 2006-10-23
  • 打赏
  • 举报
回复
如果在debug下有错误,最好检查一下,不然发布后会有一些隐藏的问题。
Kusk 2006-10-23
  • 打赏
  • 举报
回复
可以考虑在DEBUG下单步调试或者设置断点,找出在哪里出的错误再修正之。
飞哥 2006-10-23
  • 打赏
  • 举报
回复
别忘了,debug是调试用的,release用来发布的

我们应该在调试模式下编辑代码
飞哥 2006-10-23
  • 打赏
  • 举报
回复
请楼主仔细检查代码
~~~~~~~~·
飞哥 2006-10-23
  • 打赏
  • 举报
回复
3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
cubety 2006-10-23
  • 打赏
  • 举报
回复
MARK
lhj 2006-10-23
  • 打赏
  • 举报
回复
for( vector< CScene* >::iterator ii = g_sceneContainer.begin(); ii != g_sceneContainer.end(); ++ ii )
{
delete (*ii);
}
//可以考虑在这里加一个清空的操作
g_sceneContainer.clear();
kevinlynx 2006-10-23
  • 打赏
  • 举报
回复
动态分配,也有效----没效的话程序里无法使用,错误出在程序退出调用上面的销毁代码时:

for( int i = 0; i < count; ++ i )
{
CScene *newScene = new CScene();

fscanf( fp, "%d %f %f %f %f %f %d %d",
&newScene->m_index,
&newScene->m_x,
&newScene->m_y,
&newScene->m_z,
&newScene->m_hScale,
&newScene->m_vScale,
(int*)&newScene->m_bHFlip,
(int*)&newScene->m_bVFlip
);

newScene->m_sp = g_sceneSet[ newScene->m_index ]->m_sp;

g_sceneContainer.push_back( newScene );
}
sinall 2006-10-23
  • 打赏
  • 举报
回复
for( vector< CScene* >::iterator ii = g_sceneContainer.begin(); ii != g_sceneContainer.end(); ++ ii )
{
delete (*ii);
}
——这个代码没问题,注意,你的g_sceneContainer的元素都是动态分配且是有效的。
kevinlynx 2006-10-23
  • 打赏
  • 举报
回复
谢谢 wanfustudio(雁南飞:不慕虚名务潜修) 贴的一分很详尽的解释,这里是我代码中主要错误的地方:

for( vector< CScene* >::iterator ii = g_sceneContainer.begin(); ii != g_sceneContainer.end(); ++ ii )
{
delete (*ii);

//i = g_sceneContainer.erase( i );

}

我找不出错误~~
sinall 2006-10-23
  • 打赏
  • 举报
回复
有时候程序在debug模式下会出现崩溃性错误!
————————————————————————————————————————
发现并纠正这些错误!
weijiangshanwww 2006-10-23
  • 打赏
  • 举报
回复


debug是调试模式,可以加入自己的断言(alert)及使用debug标记等,而且最重要的它会在生成的IL(中间代码)中加入调式信息,并生成调试数据库。
release是部署用的,它会对代码进行一定的优化,并会忽略debug标记。
最后交出的产品用release模式,release模式多了优化,少了对debug类相关的编译,少了调试用中间代码,少了调试数据库的生成。

weijiangshanwww 2006-10-23
  • 打赏
  • 举报
回复



debug 是一种调试状态,而Release是一种运行状态,也可以叫做发布状态
weijiangshanwww 2006-10-23
  • 打赏
  • 举报
回复
據我個人的理解就是 DEBUG模式編譯後有很多可供調試用的符號表等,方便開發之用
而RELEASE模式沒有與應用無關的代碼,變量.用來發布

但是我的幾個程序在兩種模式下運行結果不一樣

我自己用IO口模擬的一個PS2鍵盤的程序, 在DEBUG模式下可正常運行,而在RELEASE模式下不能運行
有的程序在SDRAM可以RUN,等我用FLASH PROGRAMMER燒進EPCS後又不能運行
但又不是全都這樣
飞哥 2006-10-23
  • 打赏
  • 举报
回复
VC下关于debug和release的不同的讨论
作者:zx_sanjin


VC下关于debug和release的不同的讨论 zx_sanjin(1.5kg), shanghai

create: 15:39 2002-12-20
modify: 13:56 2003-1-24

mail : zx_sanjin@163.com
qq : 923452

======================================================

在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:


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. 尽量使用模块,不但表达清楚而且方便调试。

注1:
afc(afc) 网友提供:
debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地

注2:
不知大家有没有遇到过这种情况,具体原因我也不太清楚,是不是调用时按着默认的参数多分配了WPARAM+LPARAM的空间而破坏了应用程序的内存空间?还请高手来补充。

NightWolf 网友提供:我遇见过,好像是在函数调用的时候参数入栈的问题。因为MFC的消息使用宏写的,所以如果定义了OnMessage()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就。。。

(完) thanks
Kusk 2006-10-23
  • 打赏
  • 举报
回复
debug会有一些严格的检查机制,所以程序有了问题可能会被检查出来导致程序中止。
但release去掉这些机制之后可能程序运行时不一定发现得了。但不意味着你的程序永远能正确运行下去。
建议检查一下你的程序。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧