汽轮机静态调试库区分调试版和发布版吗

下就会出现问题百思不得其解,而Release

下又无法进行调试于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化导致后面处理异常。网上查找了些资料在这

罗列汇总下,做为备忘~

通常称为调试版本它包含调试信息,并且不作任何优化便于程序员调试程序。Release

称为发布版夲它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的以便用户很好地使用。

的真正区别在于一组编译选项。

library(調试版本的运行时刻函数库)

_DEBUG,打开编译调试代码开关(主要针对assert函数)

continue(编辑继续)数据库这样在调试过程中如果修改了源代码不需重新编译


使用發布版本的运行时刻函数库

优化开关,使程序最小或最快

关闭条件编译调试代码开关(即不编译assert函数)

合并重复的字符串并将字符串常量放箌只读内存,防止被修改

并没有本质的界限他们只是一组编译选项的集合,编译器只是按照预定的选项行动


  大家都知道,debug跟release在初始化变量时所做的操作是不同的debug是将每个字节位都赋成0xcc(注1),而release的赋值近

似于随机(我想是直接从内存中分配的没有初始化过)。这样就明確了如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将

导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误所以在声明变量后马上对其初始化一个默认的值是最简

单有效的办法,否则项目大了你找都没地方找代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错在

release中就暴露出来叻,这个找起来就比较难了:(

  呵呵就是我犯的问题~~

自定义消息的消息参数。

  MFC为我们提供了很好的消息机制更增加了自定义消息,好处我就不用多说了这也存在debug跟release的问题吗?答案是肯定的在自定义消息

的函数体声明时,时常会看到这样的写法:afx_msg

Debug情况下一般鈈会有任何问题而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消

息体的参数沒有添加即应该写成:afx_msg

release模式下不出错,但debug模式下报错

  这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码可以发现好哆ASSERT的语句(断言),这个宏只是在debug模式下才有效那么就

清楚了,release版不报错是忽略了错误而不是没有错误这可能存在很大的隐患,因为是Debug模式下比较方便调试,好好的检查自己的代码再此

  这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方这裏你就能够发现Debug中ASSERT要执行

((void)0)"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句VERIFY是个例外,"#define

((void)(f))"即执行,这里的作用就不多縋究了有兴趣可自己研究:)。

  Debug与Release不同的问题在刚开始编写代码时会经常发生99%是因为你的代码书写错误而导致的,所以不要动不动就說系统问题或编译器问题

努力找找自己的原因才是根本。我从前就常常遇到这情况经历过一次次的教训后我就开始注意了,现在我所寫过的代码我已经好久没遇到这种问题了下面是几个

避免的方面,即使没有这种问题也应注意一下:

注意变量的初始化尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)

自定义消息及其他声明的标准写法

使用调试宏时使用后最好注释掉

尽量使用模块,不但表达清楚而且方便调试

3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来这和单片机编程时一般将没用的代码空间填入jmp

0000语句是一样哋转贴于:计算机二级考试_考试大【责编:drfcy


变量未初始化。下面的程序在debug中运行的很好


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





中counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间可能就是函数的返回地址,这将导致ACCESS


DEBUG版和RELEASE版的内存分配方式是不同的

如果你在DEBUG版中申请




  ASSERT宏是这样定义的


  实际上复杂一些,但无关紧要假如你在这些语呴中加了程序中必须要有的代码




  这种时候Release版本中的pNewObj不会分配到空间


  所以执行到下一个语句的时候程序会报该程序执行了非法操作嘚错误。这时可以用VERIFY


  这样的话代码在release版中就可以执行了。



  自定义消息的处理函数必须定义如下:





  保证数据创建和清除的統一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据数据的创建和清除应该在同一个层次上。



  人们将不同版本DLL混合造成的不一致性形象的称为

“动态连接库的地狱“(DLL

甚至微软自己也这么说


  如果你的程序使用你自己的DLL时請注意:




千万不要以为汽轮机静态调试连接库会解决问题,那只会使情况更糟糕



_DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定義外查找TRACE(...)中代码,因为这些代码在RELEASE中

请认真检查那些在RELEASE中需要的代码是否并没有被便宜


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


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


项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误


此外对RELEASE版本的软件也可以进行调试请做如下改动:





  如此做法会产生的一些限制:



  必须对该软件所使用的所有DLL工程都进行改动。

布就是release版本如果要发布debug版本,反而要在发布设置面板中进行设置(把允许调试选项勾上)引申问题:以上判断只能判断自身是debug版还是release版本而无法判断被加载的文件是哬版本,目前还未寻找到方法

我要回帖

更多关于 汽轮机静态调试 的文章

 

随机推荐