DEBUG 和 RELEASE 版本差异及调试相关问题: I. 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 版中则不会。 所以尽可能的给变量、类或结构初始化。 数据溢出的问题 如: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 为
2.
6*sizeof(DWORD)=24bytes,实际上分配给你的是 32bytes(debug 版以 32bytes 为单位分配) 而 , 在 release 版,分配给你的就是 24bytes(release 版以 8bytes 为单位) ,所以在 debug 版中如果你写 ele[6],可能不会有什么问题,而在 release 版中,就有 ACCESS VIOLATE。 II. 1. ASSERT 和 VERIFY 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 同时应该提 供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。 DLL 的灾难
V.
人们将不同版本 DLL 混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也 这么说(msdn.microsoft/library/techart/dlldanger1.htm)。 如果你的程序使用你自己的 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 或 4,然后保证在编译时没有警告出现.
3.
VII. 将 Project Settings" 中 "C++/C " 项目下优化选项改为 Disbale(Debug) 。编译器的优化可能 导致许多意想不到的错误,请参考 pgh.net/~newcomer/debug_release.htm 1. 此外对 RELEASE 版本的软件也可以进行调试,请做如下改动:
在"Pro