现在的位置: 首页 > 综合 > 正文

vc6 debug release 结果不一致问题

2013年12月08日 ⁄ 综合 ⁄ 共 2034字 ⁄ 字号 评论关闭

网上找了些资料,但未能解决我的问题:

I.   内存分配问题 
  1.   变量未初始化。 
  为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版中,就有A 
  CCESS   VIOLATE。 
  II.   ASSERT和VERIFY 
  1.   ASSERT在Release版本中是不会被编译的。   
  假如你在这些语句中加了程序中必须要有的代 
  码 
  比如 
  ASSERT(pNewObj   =   new   CMyClass); 
  pNewObj->MyFunction(); 
  这种时候Release版本中的pNewObj不会分配到空间 
  所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY   
  III.   参数问题: 
  自定义消息的处理函数,必须定义如下: 
  afx_msg   LRESULT   OnMyMessage(WPARAM,   LPARAM); 
  返回值必须是HRESULT型,否则Debug会过,而Release出错   
  IV.   内存分配 
  保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个D 
  LL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。 
  V.   DLL的灾难 
  人们将不同版本DLL混合造成的不一致性形象的称为   “动态连接库的地狱“(DLL   Hell)   
  如果你的程序使用你自己的DLL时请注意: 
  1.   不能将debug和release版的DLL混合在一起使用。debug都是debug版,releas 
  e版都是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)。编 
  译器的优化可能导致许多意想不到的错误,请参考 http://www.pgh.net/~newcomer/deb 
  ug_release.htm 
  1.   此外对RELEASE版本的软件也可以进行调试,请做如下改动: 
  在"Project   Settings"   中   "C++/C   "   项目下设置   "category"   为   "General"   并且将"D 
  ebug   Info"设置为   "Program   Database"。 
  在"Link"项目下选中"Generate   Debug   Info"检查框。 
  "Rebuild   All" 
  如此做法会产生的一些限制: 
  无法获得在MFC   DLL中的变量的值。 
  必须对该软件所使用的所有DLL工程都进行改动。    

 

我查啊查啊查啊,查了好多天。后来换到另一台电脑上重新编译:创天中文VC6,原来那台是英文版的。

但是竟然没有问题了。

难道是创天VC和英文VC?还是环境?

不得其解......

抱歉!评论已关闭.