西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页西西教程其它教程 → Debug与Trace的区别?

Debug与Trace的区别?

相关软件相关文章发表评论 来源:西西教程网时间:2013/12/16 14:49:27字体大小:A-A+

作者:西西点击:92次评论:0次标签: Debug Trace

  • 类型:编程辅助大小:1.8M语言:英文 评分:6.0
  • 标签:
立即下载

1. Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?

Debug类提供一组帮助调试代码的方法和属性。Trace类提供一组帮助跟踪代码执行的方法和属性,通俗的说就是为在不打断程序的调试或跟踪下,用来记录程序执行的过程。

Debug只在debug状态下会输出,Trace在Release下也会输出,在Release下Debug的内容会消失。

2. Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。

首先以一个表格说明问题:

项目
 Debug
 Release
 
条件编译常数
 Debug;Trace
 Trace
 
优化代码
 False
 True
 
输出路径
 bin\Debug
 bin\Release
 
生成调试信息
 True
 False


Debug模式下生成的程序集为调试版本,未经优化;在bin\debug\目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;Release模式下不包含调试信息,并对代码进行了优化,\bin\release\目录下只有一个.exe或.dll文件。在项目文件夹下除了bin外,还有个obj目录。编译是分模块编译的,每个模块的编译结果就保存在了obj目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj的目录的作用就是保存这些小块的编译结果,加快编译速度。

Debug只在debug状态下会输出,Trace在release下也会输出,在release下Debug的内容会消失

Debug类提供一组帮助调试代码的方法和属性。Trace类提供一组帮助跟踪代码执行的方法和属性,通俗的说就是为在不打断程序的调试或跟踪下,用来记录程序执行的过程。两个类都是密封类,不能被继承。 Debug类的例子(代码A): TextWriterTraceListener myListener=new TextWriterTraceListener(“F:""DebugLog.txt”); Debug.Listeners.Add(myListener); Debug.WriteLine("这是调试"); Debug.Flush(); Listener.Flush(); Trace类的例子(代码B): TextWriterTraceListener myListener=new TextWriterTraceListener("F:""TraceLog.txt"); Trace.Listeners.Add(Listener); Trace.WriteLine("这是跟踪"); Trace.Flush(); Listener.Flush(); 这两个类有什么区别呢? 我们可以通过选择项目的调试方式为“Debug”: 用代码A测试,会发现F:"DebugLog.txt中有内容,为“这是调试”,如果用代码B测试,会发现F:"TraceLog.txt中有内容,为“这是跟踪”。 我们也可以通过选择项目的调试方式为“Release”: 同样用A,B两段代码测试,会发现,F:"DebugLog.txt中是没有内容的,但F:"TraceLog.txt中还是“这是跟踪”的文字。这里说明了一点,Debug类的内容输出,只在Debug模式下生成的exe中起作用,如果改成Release模式下生成的exe,就失去了作用,Trace类则都起作用 用代码A测试,会发现F:"DebugLog.txt中有内容,为“这是调试”,如果用代码B测试,会发现F:"TraceLog.txt中有内容,为“这是跟踪”。 现在,我们设置程序为发布方式,如下图所示 同样用A,B两段代码测试,会发现,F:"DebugLog.txt中是没有内容的,但F:"TraceLog.txt中还是“这是跟踪”的文字。这里说明了一点,Debug类的内容输出,只在Debug模式下生成的exe中起作用,如果改成Release模式下生成的exe,就失去了作用,Trace类则都起作用。


Debug上的大多数诊断函数需要当前项目定义了"DEBUG"预定义变量才能够使用。否则,将不执行任何操作。 Trace检查的预定义变量是"TRACE"。 默认情况下,项目的Debug配置会定义DEBUG和TRACE两个预定义常量。但是Release配置仅仅定义了TRACE常量。这就是为什么你发现Debug.WriteLine在Release模式下没有任何输出。相关细节,你可以查看一下MSDN中关于ConditionalAttribute的描述。 修改这些配置,可以通过Project -> XXXXX Properties -> Build -> Define DEBUG constant 启用和禁用DEBUG或TRACE常量。

如何使用?

Debug和Trace两个类都有很多静态方法和属性可以使用,并且Debug和Trace大部分方法都不仅名称一样,用法也很相似。

如:

Write系列和WriteLine系列方法,同TextWriter中一样,是用作输出的。要注意的是Debug中有个Print方法,它和WriteLine的功能是一样的,而不是和Write一样。WriteIf系列函数只是加了个 判断。

Indent/Unindent这样个方法和IndentLevel, IndentSize这两个属性,它们是控制缩进的。

AutoFlush属性是控制刷新的,为true是每次调用Write都会刷新。

Listeners属性,类型是TracerListenersCollection, 可以通过这个属性来添加Debug/Trace输出的监听者。

Fail方法,指示出错信息。一般会弹出一个错误对话框:



Debug/Trace的效率

Debug和Trace所有的公有方法都有[Conditional("DEBUG")]或[Conditional("TRACE")]属性(Attribute),所以只要编译时不定义DEBUG/TRACE宏,Debug/Trace的相应方法都不会被调用。

VS中默认配置中Debug配置下定义了DEBUG和TRACE,Release配置下定义了TRACE。

在调试时VS会自动添加一个TraceListener,输出到输出窗口(Output):


    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)