VC下Release版出错,Debug版的不出错原因

转载 2013年05月04日 11:51:18

 


. 内存分配问题

1. 变量未初始化。

下面的程序在debug中运行的很好。

thing * search(thing * something)

BOOL found;

for(int i = 0; i < whatever.GetSize(); i++)

{

     if(whatever[i]->field == something->field)

     {

         /* found it */

         found = TRUE;

         break;

      }

      /* found it */

}

if(found)

     return whatever[i];

else

     return NULL;

而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。

2. 数据溢出的问题 如:char buffer[10]; int counter; lstrcpy(buffer, "abcdefghik"); 在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。

3. DEBUG版和RELEASE版的内存分配方式是不同的 。如果你在DEBUG版中申请 ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。

II. ASSERT和VERIFY

1. ASSERT在Release版本中是不会被编译的。 ASSERT宏是这样定义的 #ifdef _DEBUG #define ASSERT(x) if( (x) == 0) report_assert_failure() #else #define ASSERT(x) #endif 实际上复杂一些,但无关紧要。假如你在这些语句中加了程序中必须要有的代码 比如 ASSERT(pNewObj = new CMyClass); pNewObj->MyFunction(); 这种时候Release版本中的pNewObj不会分配到空间,所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY : #ifdef _DEBUG #define VERIFY(x) if( (x) == 0) report_assert_failure() #else #define VERIFY(x) (x) #endif 这样的话,代码在release版中就可以执行了。

III. 参数问题: 自定义消息的处理函数,必须定义如下: afx_msg LRESULT OnMyMessage(WPARAM, LPARAM); 返回值必须是HRESULT型,否则Debug会过,而Release出错 IV. 内存分配 保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。 V. DLL的灾难 人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说, 如果你的程序使用你自己的DLL时请注意: 1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。 解决办法是将debug和release的程序分别放在主程序的debug和release目录下 2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕。

VI. RELEASE板中的调试 :

1. 将ASSERT() 改为 VERIFY() 。找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被便宜。

2. 变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。

3. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.

VII. 将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误。

1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动: 在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database"。 在"Link"项目下选中"Generate Debug Info"检查框。 "Rebuild All" 如此做法会产生的一些限制: 无法获得在MFC DLL中的变量的值。 必须对该软件所使用的所有DLL工程都进行改动。 另: MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的"Maximize Speed"优化选项并未被完全支持,因此这将会引起内存错误并导致程序崩溃。

2. www.sysinternals.com有一个程序DebugView,用来捕捉OutputDebugString的输出,运行起来后(估计是自设为system debugger)就可以观看所有程序的OutputDebugString的输出。此后,你可以脱离VC来运行你的程序并观看调试信息。

3. 有一个叫Gimpel Lint的静态代码检查工具,据说比较好用http://www.gimpel.com 不过要化$的。

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

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

为什么Release版出错,Debug版的不出错

为什么Release版出错,Debug版的不出错? 内存分配问题 1.   变量未初始化。下面的程序在debug中运行的很好。 thing   *   search(thing   * ...
  • xiaoqi2008
  • xiaoqi2008
  • 2014年09月01日 13:50
  • 173

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

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

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

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

VC++中debug跟release编译模式的区别总结

Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当...
  • business122
  • business122
  • 2016年07月07日 17:27
  • 982

ProC血的教训!Connect失败也必须RELEASE!

又到日志时间啦,最近工作上遇到一个问题,数据库在两个IP地址上监听,所以程序在检测到数据库连接断开后,就要切换到另一个IP上去连接数据库,因此我写了一个函数去做这件事,主要就是 EXEC SQL CO...
  • herobox
  • herobox
  • 2013年12月03日 18:15
  • 1409

VC调用FFMPEG release版出错的解决办法

vs2005 win7 下开发视频服务器, ,用到ffmpeg,debug版本运行正常,切换到release时,出现"0x00905a4d 处未处理的异常: 0xC0000005: 读取位置 0x00...
  • eatjpg
  • eatjpg
  • 2015年09月22日 12:23
  • 372

Android Studio 生成debug版本正常,生成release版本报错

最近的任务是优化一个老项目,这个项目的开发工具一直以来都是Inteliji IDEA,项目除了生成测试包外,还会有UAT包、生产包等,需要频繁的手动更改IP地址、端口等等一些参数。新项目的开发都是...
  • arson663300
  • arson663300
  • 2016年08月03日 21:14
  • 5226

debug和release版本的区别

最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一...
  • u014744118
  • u014744118
  • 2015年09月08日 10:48
  • 1969

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

在调试程序的时候经常遇到一个问题:debug版运行的很正常,查不出任何问题,到了release版,运行一会儿就崩溃了。最近一段时间查了很多资料,终于是找到了原因所在。讲解如下:     遇到这种问题...
  • oket007
  • oket007
  • 2013年12月23日 08:36
  • 879
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC下Release版出错,Debug版的不出错原因
举报原因:
原因补充:

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