Dot Net的調試 - 2
2024-07-21 02:24:43
供稿:網友
fail方法不能阻止應用程序運行,他們僅僅輸出錯誤信息。write和writeline方法寫入一個消息。他們不同之處僅僅在于后者輸出執行后再輸出一行。最后,flush方法刷新緩存。flush方法對跟蹤信息輸出的設備有作用(例如,流)。你可以使用自動刷新—每個信息后都自動刷新偵聽者。可以在配置文件里面配置:
<configuration>
<stream.diagnostics>
<trace autoflush = “false” />
</stream.diagnostics>
</configuration>
正如你看到的,如果你創建自己的傾聽者,需要至少實現write(string)和writeline(string)方法(這些方法是抽象方法)。
微軟提供三種跟蹤偵聽者:defaulttracelistener,eventlogtracelistener和textwritetracelister.。第一個偵聽者有缺省的方法(如果應用程序在命令行的環境下運行,那么輸出信息到控制臺。如果應用程序在調試情況下,輸出到窗口)。第二個偵聽者輸出信息到指定事件日志中(基于nt技術—winnt,2k,xp或者.net)。第三個傾聽者輸出文本到流中。
活動傾聽者列表可以在編程中設置或者在配置文件中。缺省包括defaulttracelistener.
編程改變活動傾聽者列表,要管理傾聽者集合(通過添加和刪除方法)。配置文件中管理傾聽者,你要用下邊的語法:
<configuration>
<system.diagnostics>
<trace autoflust=”false” indentsize = 4>
<listeners>
<add name=”mylistener” type=”system.dianostics.textwritertracelistener, system”
initializedata = “c:/mylistener.log”/>
<remove type = “system.diagnostics.defaulttracelistener,system”/>
</listeners>
</trace>
</system.dianostics>
</configuration>
initializedat參數是傳遞到構造器的的字符串參數(指定eventlogtracelistener偵聽者事件日志)。
偵聽者很熟悉創建應用程序使用偵聽者輸出跟蹤信息。代碼很簡單:
//trace listeners demo
//
//purpose:to demonstrate how to use listeners
using system;
using system.diagnostics;
namespace assertion
{
class application
{
[stathread]
static void main(string[] args)
{
trace.writeline(“calling writeline method”, “trace listeners demo”);
trace.flush();
}
}
}
這些代碼還不夠,我們必須創建一個配置文件來設置偵聽者:
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<remove type="system.diagnostics.defaulttracelistener"/>
<add name="mylistener" type="system.diagnostics.textwritertracelistener"
initializedata="mylistener.log" />
<add name="mylistenereventlog" type="system.diagnostics.eventlogtracelistener"
initializedata="application" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
這個配置文件刪除了缺省偵聽者加入兩個自定義偵聽者:第一個輸出信息到文本文件,第二個輸出到事件日志中。對于第一個偵聽者initializedata屬性指定輸出數據的文件,第二偵聽者記錄事件到事件日志。
運行程序。檢查第一個偵聽者,可以看到mylistener.log文件,它包含以下信息:tracing listeners demo:calling writeline method
第一個偵聽者把信息寫入文本文件中。察看第二個。打開微軟控制臺在事件視圖中瀏覽應用程序事件日志(這個就是我們在配置文件中指定的)。在這里可以看到我們應用程序的事件信息。更多的可能,在這個列表最上邊。如果你雙擊,可以看到其中的內容。我們發現如下信息:
是輸出信息更加容易閱讀:
有時候應用程序很復雜,為了容易理解可以格式化跟蹤信息。使輸出信息更加漂亮,可以使用縮排,看下面的簡單代碼:
public void callee()
{
trace.wrteline(“callee started”);
……//some internal logic
trace.writeline(“initializing buffer”);
……//some extra internal login
trace.writeline(“exiting callee”);
}
public void caller()
{
trace.write(“caller called”);
…..//some external logic
callee();
…..//some extral logic
trace.writeline(“initializing buffer”);
trace.write(“exiting caller”);
}
輸出信息如下:
caller called
callee stared
initializing buffer
exiting callee
initializing buffer
exiting caller
如果方法執行前后沒有顯示信息,我們將被這些拷貝的初始化緩存信息所迷惑。除了信息顯示不清楚。為了避免不明確,我們使用trace類支持的縮進功能。修改的代碼,使用縮進:
public void callee()
{
trace.indent();
trace.writeline(“callee started”);
…..//some internal logic
trace.writeline(“initializing buffer”);
….//some extra internal logic
trace.writeline(“exiting callee”);
trace.unindent();
}
public void caller()
{
trace.write(“caller called”);
….//some external logic
callee();
….//some extra login
trace.writeline(“initiallizing buffer”);
trace.write(“exiting caller”);
}
輸出信息如下:
caller called
callee started
initializing buffer
exiting callee
initializing buffer
exiting caller
正如你看到的,callee方法輸出縮進,很容易分開不同方法的信息。可以調用indent和unident方法,達到分離信息的目的。
在配置文件中修改跟蹤配置:
<configuration>
<system.diagnostics>
<trace indentsize = “3” / >
</system.diagnostics>
</configuration>