
- 類型:編程輔助大。1.8M語言:英文 評分:6.0
- 標(biāo)簽:
1. Debug.Write和Trace.Write有什么不同?何時應(yīng)該使用哪一個?
Debug類提供一組幫助調(diào)試代碼的方法和屬性。Trace類提供一組幫助跟蹤代碼執(zhí)行的方法和屬性,通俗的說就是為在不打斷程序的調(diào)試或跟蹤下,用來記錄程序執(zhí)行的過程。
Debug只在debug狀態(tài)下會輸出,Trace在Release下也會輸出,在Release下Debug的內(nèi)容會消失。
2. Debug Build和Release Build的區(qū)別,是否會有明顯的速度變化?請說明理由。
首先以一個表格說明問題:
項目
Debug
Release
條件編譯常數(shù)
Debug;Trace
Trace
優(yōu)化代碼
False
True
輸出路徑
bin\Debug
bin\Release
生成調(diào)試信息
True
False
Debug模式下生成的程序集為調(diào)試版本,未經(jīng)優(yōu)化;在bin\debug\目錄中有兩個文件,除了要生成的.exe或.dll文件外,還有個.pdb文件,這個.pdb文件中就記錄了代碼中的斷點等調(diào)試信息;Release模式下不包含調(diào)試信息,并對代碼進(jìn)行了優(yōu)化,\bin\release\目錄下只有一個.exe或.dll文件。在項目文件夾下除了bin外,還有個obj目錄。編譯是分模塊編譯的,每個模塊的編譯結(jié)果就保存在了obj目錄下。最后會合并為一個exe或者dll文件保存到bin之中。因為每次編譯都是增量編譯,也就是只重新編譯改變了的模塊,所以這個obj的目錄的作用就是保存這些小塊的編譯結(jié)果,加快編譯速度。
Debug只在debug狀態(tài)下會輸出,Trace在release下也會輸出,在release下Debug的內(nèi)容會消失
Debug類提供一組幫助調(diào)試代碼的方法和屬性。Trace類提供一組幫助跟蹤代碼執(zhí)行的方法和屬性,通俗的說就是為在不打斷程序的調(diào)試或跟蹤下,用來記錄程序執(zhí)行的過程。兩個類都是密封類,不能被繼承。 Debug類的例子(代碼A): TextWriterTraceListener myListener=new TextWriterTraceListener(“F:""DebugLog.txt”); Debug.Listeners.Add(myListener); Debug.WriteLine("這是調(diào)試"); Debug.Flush(); Listener.Flush(); Trace類的例子(代碼B): TextWriterTraceListener myListener=new TextWriterTraceListener("F:""TraceLog.txt"); Trace.Listeners.Add(Listener); Trace.WriteLine("這是跟蹤"); Trace.Flush(); Listener.Flush(); 這兩個類有什么區(qū)別呢? 我們可以通過選擇項目的調(diào)試方式為“Debug”: 用代碼A測試,會發(fā)現(xiàn)F:"DebugLog.txt中有內(nèi)容,為“這是調(diào)試”,如果用代碼B測試,會發(fā)現(xiàn)F:"TraceLog.txt中有內(nèi)容,為“這是跟蹤”。 我們也可以通過選擇項目的調(diào)試方式為“Release”: 同樣用A,B兩段代碼測試,會發(fā)現(xiàn),F(xiàn):"DebugLog.txt中是沒有內(nèi)容的,但F:"TraceLog.txt中還是“這是跟蹤”的文字。這里說明了一點,Debug類的內(nèi)容輸出,只在Debug模式下生成的exe中起作用,如果改成Release模式下生成的exe,就失去了作用,Trace類則都起作用 用代碼A測試,會發(fā)現(xiàn)F:"DebugLog.txt中有內(nèi)容,為“這是調(diào)試”,如果用代碼B測試,會發(fā)現(xiàn)F:"TraceLog.txt中有內(nèi)容,為“這是跟蹤”。 現(xiàn)在,我們設(shè)置程序為發(fā)布方式,如下圖所示 同樣用A,B兩段代碼測試,會發(fā)現(xiàn),F(xiàn):"DebugLog.txt中是沒有內(nèi)容的,但F:"TraceLog.txt中還是“這是跟蹤”的文字。這里說明了一點,Debug類的內(nèi)容輸出,只在Debug模式下生成的exe中起作用,如果改成Release模式下生成的exe,就失去了作用,Trace類則都起作用。
Debug上的大多數(shù)診斷函數(shù)需要當(dāng)前項目定義了"DEBUG"預(yù)定義變量才能夠使用。否則,將不執(zhí)行任何操作。 Trace檢查的預(yù)定義變量是"TRACE"。 默認(rèn)情況下,項目的Debug配置會定義DEBUG和TRACE兩個預(yù)定義常量。但是Release配置僅僅定義了TRACE常量。這就是為什么你發(fā)現(xiàn)Debug.WriteLine在Release模式下沒有任何輸出。相關(guān)細(xì)節(jié),你可以查看一下MSDN中關(guān)于ConditionalAttribute的描述。 修改這些配置,可以通過Project -> XXXXX Properties -> Build -> Define DEBUG constant 啟用和禁用DEBUG或TRACE常量。
如何使用?
Debug和Trace兩個類都有很多靜態(tài)方法和屬性可以使用,并且Debug和Trace大部分方法都不僅名稱一樣,用法也很相似。
如:
Write系列和WriteLine系列方法,同TextWriter中一樣,是用作輸出的。要注意的是Debug中有個Print方法,它和WriteLine的功能是一樣的,而不是和Write一樣。WriteIf系列函數(shù)只是加了個 判斷。
Indent/Unindent這樣個方法和IndentLevel, IndentSize這兩個屬性,它們是控制縮進(jìn)的。
AutoFlush屬性是控制刷新的,為true是每次調(diào)用Write都會刷新。
Listeners屬性,類型是TracerListenersCollection, 可以通過這個屬性來添加Debug/Trace輸出的監(jiān)聽者。
Fail方法,指示出錯信息。一般會彈出一個錯誤對話框:
Debug/Trace的效率
Debug和Trace所有的公有方法都有[Conditional("DEBUG")]或[Conditional("TRACE")]屬性(Attribute),所以只要編譯時不定義DEBUG/TRACE宏,Debug/Trace的相應(yīng)方法都不會被調(diào)用。
VS中默認(rèn)配置中Debug配置下定義了DEBUG和TRACE,Release配置下定義了TRACE。
在調(diào)試時VS會自動添加一個TraceListener,輸出到輸出窗口(Output):