错误和程序异常行为的典型原因是什么仅在发行版编译模式下才会表现出来,而在调试模式下却不会出现?
Answers:
很多时候,在C ++中的调试模式下,所有变量都被初始化为空,而在发布模式下,除非明确说明,否则不会进行任何初始化。
检查是否有任何调试宏和未初始化的变量
您的程序是否使用线程,然后优化也会在发布模式下引起一些问题。
还要检查所有异常,例如与发布模式没有直接关系,但是有时我们只是忽略一些关键异常,例如VC ++中的mem访问冲突,但至少在其他操作系统(如Linux,Solaris)中,这同样可能是一个问题。理想情况下,您的程序不应捕获诸如访问NULL指针之类的关键异常。
一个常见的陷阱是在ASSERT中使用带有副作用的表达式。
assert(MyObj->LoadFromFile(File));
。在发行版中,根本不会调用LoadFromFile,并且不会在编译时通知您。
其他差异可能是:
GC::KeepAlive
帮助:msdn.microsoft.com/en-us/library/…–
过去,我被许多错误所困扰,这些错误在Debug版本中很好,但在Release版本中崩溃。有许多根本原因(当然包括该线程中已经概述的那些原因),并且我被以下所有方面吸引住了:
#ifdef _DEBUG
,以便在调试版本中类的大小不同。有时#ifndef NDEBUG
在发布版本中使用#ifdef
只有两种版本之一存在#pragma pack
尚未重置的,则可能会导致令人讨厌的问题。使用预编译的标头和强制包含也会发生类似的问题我多年来积累的一些技巧,可以帮助您深入了解调试/发布错误:
CRT库函数在调试与发行(/ MD与/ MDd)中的行为有所不同。
例如,调试版本通常会预先填充缓冲区,然后传递给指定的长度以验证您的要求。例子包括strcpy_s
,StringCchCopy
等等。即使串较早终止,您szDest最好是ň长字节!
在.NET中,即使您不使用条件编译#if DEBUG
器(如),编译器在发布模式下的优化仍然比调试模式下更为自由,这也可能导致仅发布错误。
如果您有条件地进行编译,从而使调试代码和发布代码不同,并且代码中存在仅在发布模式下使用的错误,则有可能。
除此之外,这是不可能的。调试代码和发布代码的编译方式有所不同,以及是否在调试器下运行,如何执行代码也有所不同,但是如果这些差异中的任何一个导致了性能差异以外的其他问题,那么问题就一直存在。
在调试版本中,可能不会发生错误(因为时序或内存分配不同),但这并不意味着该错误不存在。可能还有其他与调试模式无关的因素会改变代码的时序,从而导致错误发生与否,但这全都归结为以下事实:如果代码正确,则不会发生错误。在任何情况下
因此,不,调试版本不行,只是因为您可以运行它而不会出现错误。如果在发布模式下运行时发生错误,这不是因为发布模式,而是因为错误从一开始就存在。
有一些编译器优化可能会破坏有效代码因为它们过于激进。
尝试在打开较少优化的情况下编译代码。
另一个原因可能是数据库调用。您是否在同一线程中多次保存和更新同一记录,有时是为了更新。由于先前的create命令仍在处理中,因此更新可能失败或没有按预期方式工作,并且对于更新,db调用无法找到任何记录。这不会在调试中发生,因为调试器确保在着陆之前完成所有待处理的任务。
我记得前一阵子,当时我们在c / c ++中构建dll和pdb。
我记得这个:
然后继续经历那个周期。
有时,我们暂时将发行版换为dll的调试版本,以便在处理这些错误时不会拖延生产。