【原創】.NET中Trace類和Debug類的應用舉例
.NET中Trace類和Debug類的應用舉例
.NET中的Trace類和Debug類是System.Diagnostics名稱空間下的兩個用於除錯的類,在軟體開發中使用得當,可以幫助我們除錯開發程式,提高效率,很有用。其中,Debug類僅在除錯版本中有效,而Trace類在除錯版本和正式版本中均有效。
(1)下面先介紹下Debug類的使用:
Debug類的宣告原型:public sealed class Debug
從宣告中,我們可以看出,Debug類是無法繼承的。它的成員情況,請參見:
先看一個例子:
TestDebug.cs:
/*
* User: GoGo
* Date: 2007-12-12
* Email:[email protected]
* Blog:http://blog.csdn.net/id_9527
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics; //引入Debug類所在名稱空間
namespace traceanddebug
{
class TestDebug
{
public static void TestDebugMethod()
{
Debug.Listeners.Add(new TextWriterTraceListener
//將Debug類輸出定向到控制檯輸出
Debug.AutoFlush = true;
//設定Debug為自動輸出,即每次寫入後都呼叫Listeners上呼叫Flush
Debug.Indent();
//設定縮排
Debug.WriteLine("Debug WriteLine()");
//用Debug輸出"Debug WriteLine()"
Console.WriteLine("Console.WriteLine()");
//用Console輸出"Console.WriteLine()"
Debug.WriteLine("Debug WriteLine2()");
//用Debug
Debug.Unindent();
//取消縮排
Console.Read();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace traceanddebug
{
class Program
{
static void Main(string[] args)
{
TestDebug.TestDebugMethod();
}
}
}
結果顯示如下:
Debug WriteLine()
Console.WriteLine()
Debug WriteLine2()
從例子中,我們可以看出,Debug可以向控制檯顯示資訊。需要注意的是,我們在使用Debug時候,需要引入System.Diagnostics名稱空間。同樣,我們也可以把資訊寫入文字中,例如,把TestDebug.cs中
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
一句修改為:
Debug.Listeners.Add(new TextWriterTraceListener("c://testdebug2.log","testdebug"));
就可以向c盤的根目錄下的testdebug2.log檔案中寫入資訊了。
給你留個小問題,你能讓debug資訊寫入windows的事件檢視器裡面麼?
(看看下面的Trace類的例子,也許你就有思路了)
值得注意的是,Debug類的程式碼在release版本中是無效的,也就是說,所有的Debug類輸出語句在釋出的時候,是不會輸出的,你不用特意刪除Debug類的程式碼,就能給使用者一個沒有除錯語句的程式了。這個用起來是不是很方便呢?
Debug類除了輸出資訊之外,還有一個靜態成員函式很有用,就是Debug.Assert方法。它有三種過載形式:
Debug.Assert(Boolean)
Debug.Assert(Boolean, String)
Debug.Assert(Boolean, String)
它的作用為:檢查條件,如果該條件為 false,則顯示訊息。此函式會顯示相關堆疊資訊。
例如,我們在上面的TestDebug.cs中TestDebugMethod函式中加入一下語句:
Debug.Assert(false,"test assert");
那麼執行時,就會停在Debug.Assert呼叫的地方,彈出一個對話方塊,顯示資訊及堆疊資訊。我們在實際應用的時候,需要講例子中的false換成條件判斷,如果不滿足條件,就會停止。
(2)下面介紹Trace類的使用:
Trace類的宣告原型為:public sealed class Trace,其成員情況,請參加網址:
同樣,我們先從小例子來認識Trace類:
TestTrace.cs
/*
* User: GoGo
* Date: 2007-12-12
* Email:[email protected]
* Blog:http://blog.csdn.net/id_9527
*/
using System;
using System.Diagnostics;
namespace traceanddebug
{
public class TestTrace
{
public static void TheTrace()
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Trace.WriteLine("Trace !!!");
Console.ReadKey();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace traceanddebug
{
class Program
{
static void Main(string[] args)
{
TestTrace.TheTrace();
}
}
}
編譯執行程式,輸出結果如下:
Trace !!!
從這個例子中,我們可以看出,Trace類可以像Debug類一樣輸出資訊到控制檯。同樣,Trace類可以設定輸出定向到文字檔案或者日誌中。可以新增一下程式碼測試:
Trace.Listeners.Add(new TextWriterTraceListener("testtrace.log"));
Trace.Listeners.Add(new EventLogTraceListener("testtrace"));
Trace.AutoFlush = true;
這樣就同時把Trace!!這個字串寫入testtrace.log檔案和事件檢視器中應用程式裡面了。
除了在程式中設定資訊輸出位置外,還可以在配置檔案中設定跟蹤除錯資訊的輸出位置。預設是在控制檯輸出。我們可以通過新增配置引數,修改輸出位置。例如:
假設我們的執行程式為traceanddebug.exe,我們在相同目錄下建立traceanddebug.exe.config配置檔案,輸入如下內容:
<configuration>
<system.diagnostics>
<trace autoflush="true" indentsize="1">
<listeners>
<remove name="Default"></remove>
<add type="System.Diagnostics.EventLogTraceListener" name="myEventLog" initializeData="application">
</add>
</listeners>
</trace>
</system.diagnostics>
</configuration>
這樣我們可以修改程式TheTrace()為:
//Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Trace.WriteLine("Trace !!!");
Console.ReadKey();
這樣就可以把結果直接寫入事件檢視器中。
由於Trace類可以在釋出版本中起作用,所以,在做Trace輸出資訊的時候,可能有些資訊是除錯的時候需要,釋出的時候又不需要了,那怎麼才能保證資訊不在釋出的時候輸出呢?.NET為我們提供了五個控制Trace的跟蹤級別,使用它們不必重新編譯,他們跟別是:
Trace Level |
Value |
顯示(或寫入指定輸出目標)的訊息型別 |
Off |
0 |
無,即關閉顯示資訊 |
Errors |
1 |
僅限錯誤資訊 |
Warnings |
2 |
警告訊息和錯誤資訊 |
Info |
3 |
提示資訊、警告訊息和錯誤資訊 |
Verbose |
4 |
詳細訊息、提示性訊息、警告訊息和錯誤資訊 |
是否顯示訊息,由TraceSwich開關類決定。即如果設定開關為4,那麼所有的Trace訊息都將顯示;如果設定為3,那麼設定為Verbose的Trace訊息就不顯示了,其餘的都顯示;如果設定為0,所有的訊息都不顯示了。這裡設定的開關,可以在配置檔案中設定,也可以在程式中設定,下面就舉例說明。
TestTrace.cs
/*
* User: GoGo
* Date: 2007-12-12
* Email:[email protected]
* Blog:http://blog.csdn.net/id_9527
*/
using System;
using System.Diagnostics;
namespace traceanddebug
{
public class TestTrace
{
public static TraceSwitch ts = new TraceSwitch("mySwitch", "in the Config file");
public static void TheTrace()
{
Trace.WriteLineIf(ts.TraceError,"Error!!!");
Trace.WriteLineIf(ts.TraceWarning,"Warning!!!");
Trace.WriteLineIf(ts.TraceInfo,"Info!!!");
Trace.WriteLineIf(ts.TraceVerbose,"Verbose!!!");
Console.ReadKey();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace traceanddebug
{
class Program
{
static void Main(string[] args)
{
TestTrace.TheTrace();
}
}
}
編譯出的可執行檔名為:traceanddebug.exe
我們在相同目錄下,新增配置檔案traceanddebug.exe.config,並輸入內容為:
traceanddebug.exe.config
<configuration>
<system.diagnostics>
<switches>
<add name="mySwitch" value="0" />
</switches>
</system.diagnostics>
</configuration>
編譯執行,沒有顯示資訊。我們將traceanddebug.exe.config用記事本開啟,修改mySwitch的值為1,儲存,編譯執行,結果顯示”Error!!!”;同理,我們依次,將值修改為2,3,4檢視結果,分別為Warning!!!,Info!!!,Verbose!!!。
有此,我們可以看出,通過控制開關級別,就可以顯示不同的級別的資訊,而不用重新編譯,那麼及時在軟體已經發布的時候,我們也可以通過修改配置檔案,而檢視相關資訊。
通過以上的內容,我們可以對Trace和Debug類有個大概的瞭解,那麼如果你需要除錯程式,不妨用一下這兩個類。
相關推薦
【原創】.NET中Trace類和Debug類的應用舉例
.NET中Trace類和Debug類的應用舉例 .NET中的Trace類和Debug類是System.Diagnostics名稱空間下的兩個用於除錯的類,在軟體開發中使用得當,可以幫助我們除錯開發程式,提高效率,很有用。其中,Debug類僅在除錯版本中有效,而Trace
【轉】CSS中的浮動和清除浮動
但是 spa 下拉 而已 ges 推薦 授權 自己的 -c 以下轉自《CSS中的浮動和清除浮動,梳理一下!》 浮動到底是什麽? 浮動核心就一句話:浮動元素會脫離文檔流並向左/向右浮動,直到碰到父元素或者另一個浮動元素。請默念3次! 浮動最初設計的目
【原創】MapReduce運行原理和過程
文件合並 pil file 運行流程 dfs lec 線程 操作 合並 一.Map的原理和運行流程 Map的輸入數據源是多種多樣的,我們使用hdfs作為數據源。文件在hdfs上是以block(塊,Hdfs上的存儲單元)為單位進行存儲的。 1.分片 我們將
【原創】Mysql中select的正確姿勢
引言 大家在開發中,還有很多童鞋在寫查詢語句的時候,習慣寫下面這種不規範sql select * from table 而不寫成下面的這種規範方式 select col1,col2,...,coln from table 我也知道,這些童鞋是圖方便,畢竟再敲一堆的列名,嫌麻煩! 你們上班可以問問自己
【Ansible】 Playbook 中的變數和引用
Playbook 中的變數和引用1.1 通過Inventory來定義host和group變數說明:1. host 變數只對當前host起作用2. group 變數對組內的所有host起作用示例Inventory定義 [test]ansible1ansible2ansible3[test:vars]inv
【Python】python 中 的 memoize 和 memoized
python 中編寫遞迴函式時,為減少計算時間,需要用到 memoize 或 memoized 功能。 它們的作用是:記憶函式每次執行的結果,當遞迴函式每次遞迴時,若已經計算過子函式,就直接從記憶中的
【原創】面試中肯定會被問到的 2 個問題
之前我分別用三篇文章對簡歷和麵試注意事項做了說明: 《簡歷中千萬不要出現的 3 個問題》 《簡歷中打動人的 3 個關鍵點》 《面試時經常會被問到的 3 個問題》 今天是這個系列的第四篇,我們繼續聊面試,這次的兩個問題是: 為什麼離職? 本次想找一個什麼樣的工作
【原創】yii1中使用導航CBreadcrumbs詳解
關於使用框架中預設的導航, 在網上搜了很久,都沒有一個比較全面的解釋, 想了想,就研究研究原始碼自己總結一個算了: 一、在main.php頁面佈局中,倒入使用導航麵包屑widget:CBreadcrumbs <? $this->widget('zii.widgets.CBreadcrumbs',
【原創】資料庫中為什麼不推薦使用外來鍵約束
引言 其實這個話題是老生常談,很多人在工作中確實也不會使用外來鍵。包括在阿里的JAVA規範中也有下面這一條 【強制】不得使用外來鍵與級聯,一切外來鍵概念必須在應用層解決。 但是呢,詢問他們原因,大多是這麼回答的 每次做DELETE 或者UPDATE都必須考慮外來鍵約束,會導致開發的時候很痛苦,測試資料
【原創】演算法分享(5)聚類演算法DBSCAN
簡介 DBSCAN:Density-based spatial clustering of applications with noise is a data clustering algorithm proposed by Martin Ester, Hans-Peter
分類器是如何做檢測的?——【續】檢測中的LBP和HAAR特徵計算過程
前面介紹分類器檢測過程的示例中是以HOG特徵為例,那LBP和HAAR特徵在xml中是如何表達和測試的呢? 2.3 LBP與HAAR特徵 HAAR特徵的計算和表達方式與HOG很類似,在OpenCV的haartraining.exe中,feature儲存在每個weakc
【轉載】C# 中的委託和事件(詳解:簡單易懂的講解) C# 中的委託和事件(詳解)
本文轉載自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委託和事件(詳解) C# 中的委託和事件
【Android】專案中資料夾和檔案的作用
Table of Contents 資料夾的作用 檔案的作用 資料夾的作用 No. 資料夾 描述 1 src 存放
【原創】[更新中]CSDN·Markdown·KaTex/LaTex 用法小全
為你撰寫的故事 KaTex 〇、區分LaTex和KaTex 一、如何插入公式 分類 行中公式 獨立公式 注意 二、關於{},text{}與oper
【原創】.NET讀寫Excel工具Spire.Xls使用(3)單元格控制
前一篇文章:“.NET讀寫Excel工具Spire.Xls使用(2)Excel檔案的控制”給大家介紹了C#使用Spire.XLS來控制Excel檔案的基本功能和相關實踐程式碼。這篇文章將重點介紹C#操作Excel檔案時,對Excel單元格的控制。 以前在使用NPOI的時候,其實印象最深的還是
【原創】.NET讀寫Excel工具Spire.Xls使用(1)入門介紹
在.NET平臺,操作Excel檔案是一個非常常用的需求,目前比較常規的方法有以下幾種: 1.Office Com元件的方式:這個方式非常累人,微軟的東西總是這麼的複雜,使用起來可能非常不便,需要安裝Excel,對於伺服器,有時候還需要為配置IIS許可權。折騰人,看到很多人在群裡面使用這個東西,出現各種抓
【原創】.NET讀寫Excel工具Spire.Xls使用(2)Excel檔案的控制
前一篇文章:“.NET操作Excel利器Spire.Xls使用(1)入門介紹 ”給大家介紹了Spire.XLS的基本功能和一些比較。這篇文章將重點介紹C#操作Excel檔案時,對Excel檔案本身的相關設定,全域性控制的內容。因為這也是C#讀寫Excel檔案時經常碰到的文章,也是我在使用過程中的一
【原創】.NET讀寫Excel工具Spire.Xls使用(4)對資料操作與控制
Spire.Office for .NET是E-iceblue開發的一種企業級.NET Office編輯的軟體集合,包括Spire.Doc,Spire XLS,Spire.PDF,Spire.BarCode等等。.NET平臺的開發人員可以使用Spire.Office for .NET輕鬆的操作含有
【原創】.NET平臺機器學習元件-Infer.NET連載(一)介紹
關於本文件的說明 本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。 歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。 本人正在研究基於Infer.NET元件,並
【原創】.NET平臺機器學習元件-Infer.NET連載(二)貝葉斯分類器
關於本文件的說明 本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。 歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。 本人正在研究基於Infer.NET元件,並