西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程其它教程 → Debug與Trace的區(qū)別?

Debug與Trace的區(qū)別?

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西教程網(wǎng)時間:2013/12/16 14:49:27字體大小:A-A+

作者:西西點擊:92次評論:0次標(biāo)簽: Debug Trace

  • 類型:編程輔助大。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):


    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)