社区
C语言
帖子详情
debug和release的区别?请指教
Will27
2002-04-12 09:37:02
在用VC编译是,有debug和release两种
有什么区别呢
...全文
2682
8
打赏
收藏
debug和release的区别?请指教
在用VC编译是,有debug和release两种 有什么区别呢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Will27
2002-04-13
打赏
举报
回复
结帖
turui
2002-04-12
打赏
举报
回复
Debug自动进行变量初始化,而release不进行变量初始化
my12
2002-04-12
打赏
举报
回复
up
神医CL
2002-04-12
打赏
举报
回复
别人原创的文档,引用一下:
DEBUG和RELEASE 版本差异及调试相关问题:
. 内存分配问题
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) ,甚至微软自己也这么说(http://msdn.microsoft.com/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. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.
VII. 将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/debug_release.htm
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 不过要化$的。
参考文献:
1) http://www.cygnus-software.com/papers/release_debugging.html
2) http://www.pgh.net/~newcomer/debug_release.htm
freezingfire
2002-04-12
打赏
举报
回复
100分,分我一点吧。
debug和release还有一个区别,呵呵,编译成的exe,dll,lib文件的大小差太多了。
如果debug下正确,release版本出错,原因可能很多,毕竟debug多做了很多事。建议你用写log到文件的方法除错。
Will27
2002-04-12
打赏
举报
回复
哪如果一个在debug下调试正常的程序
做成release版本就出错了,可能是什么原因引起的呢
AdvRom
2002-04-12
打赏
举报
回复
Up
Release代码更小,执行更快,编译更严格,更慢
当然就没有了调试信息
ljhsoft
2002-04-12
打赏
举报
回复
一个为调试版本,其中包括了出错时能够定位源代码的在行,如果源文件已经改变,定位出来会有偏移,而且,在这个版本中编译器不会进行代码优化,并且在程序中能用宏定义_DEBUG来确定当前的版本。另一个为正试版本,程序出错只是进行简单的错误处理,编译器会优化代码,以提高性能。
Android微信第三方登录(个人笔记)
今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位
指教
。 微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。 微信注册应用平台的应用签名,下载 微信签名生成工具 输入项目的packageName也可以查看到。 (注意:
debug
、
Release
一定要区分,因为2种生成的微信签名不一致,会导致没有跳转、回调。。。。一般在微信开发者上面注册的是正式环境打包好的、) 申
请
微信开发者账号、应用申
请
省略。 1. AndroidManifest.xml 权限 <!-- 微信权限--> <uses-permission android:name=and
VC下
Debug
和
Release
区别
最近写代码过程中,发现
Debug
下运行正常,
Release
下就会出现问题,百思不得其解,而
Release
下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这罗列汇总下,做为备忘~ 一、
Debug
和
Release
的
区别
Debug
通常称为调试版本,它包含调试信息,并且不作任何优
Cmake 实现
debug
和
release
lib依赖项处理
一、说明 我们最近用cmake开发东西,编译vs时候,发现
debug
和
release
版本的lib库的依赖项问题,故此小结一下。若有不对之处,还
请
看官多多
指教
。 我们的使用的工程有自己编写的工程,也有借用第三方库的工程,还有没有办法找到源码的,只有dll和lib库,没有区分
debug
和
release
版本的。 所以还是分开说,一种自己工程库,一种是第三方库。在写完cmake代码
debug
和
release
的
区别
debug
和
release
的
区别
?
请
指教
楼主Will27(唯)2002-04-12 09:37:02 在 C/C++ / C语言 提问在用VC编译是,有
debug
和
release
两种 有什么
区别
呢 问题点数:30、回复次数:9Top 1 楼ljhsoft(刘建华)回复于 2002-04-12 09:43:21 得分 5一个为调试版本,其中包括了出错时能够定
debug
和
release
的不同结果
序言今天遇到一个很奇怪的问题,一个ios项目,在
debug
和
release
的结果很不相同,
debug
模式下得出的结果是符合预期的,但是在
release
模式下得出的结论不符合预期。分析原因 在
release
模式下,优化了一些东西,导致结果不符合预期?此猜测可能性比较小。 在
release
模式下,变量没有规律的初始化,变量的值都是随机的值,导致有些时序错了?此猜测可能性比较大,但是很不好排除问题。 得出
C语言
70,008
社区成员
243,256
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章