|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
31.10.1. TraceOptions.CallstackOm te weten hoe men terecht is gekomen in de code waar de boodschap verzonden is, kan men gebruik maken van TraceOptions.Callstack.
De listener maakt in dat geval gebruik van de Environment.StackTrace property. Visual Basic 2010 Broncode Imports System.Diagnostics # Const TRACE = TrueClass ExampleWithListenerTraceOutputOptionCallStack Public Shared Sub Main() Dim traceSource As New TraceSource( "myTraceSource", _ SourceLevels.All) traceSource.Listeners.Clear() Dim traceListener As New ConsoleTraceListener traceListener.TraceOutputOptions = TraceOptions.Callstack traceSource.Listeners.Add(traceListener) traceSource.TraceEvent(TraceEventType.Information, 1, "Message 1") Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Op de console verschijnt mogelijks het volgende : Console Application Output myTraceSource Information: 1 : Message 1
Callstack= at System.Environment.GetStackTrace(Exception e, Boolean needFi
leInfo)
at System.Environment.get_StackTrace()
at System.Diagnostics.TraceEventCache.get_Callstack()
at System.Diagnostics.TraceListener.WriteFooter(TraceEventCache eventCache)
at System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache, St
ring source, TraceEventType eventType, Int32 id, String message)
at System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32
id, String message)
at TestTraceSource.ExampleWithListenerTraceOutputOptionCallStack.Main() in C:
\test.vb:line 262
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySec
urity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
ontextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()Nogal veel informatie - te veel informatie - wordt weergegeven. Doorgaans zijn we enkel geïntresseerd in de calling method van de TraceEvent method. Hier bijvoorbeeld kunnen we zien dat de Main method deze heeft aangeroepen. De rest van de informatie is bijna altijd overbodig.
We zouden zelf de huidige callstack kunnen ontleden, en in tekstvorm deze als traceboodschap doorgeven aan de TraceEvent method : Visual Basic 2010 Broncode Imports System.Diagnostics # Const TRACE = TrueClass ExampleStackTrace Private Shared traceSource As TraceSource Public Shared Sub Main() traceSource = New TraceSource( "myTraceSource", _ SourceLevels.Information) traceSource.Listeners.Clear() traceSource.Listeners.Add( New ConsoleTraceListener) Method1() Console.ReadLine() End Sub Public Shared Sub Method1() Method2() End Sub Public Shared Sub Method2() Dim callstack As String Dim currentStackTrace As New System.Diagnostics. StackTrace Dim stackFrames As StackFrame() = currentStackTrace.GetFrames() Dim index As Integer = -1 Do index += 1 Dim method As Reflection. MethodBase = stackFrames(index).GetMethod() callstack &= method.ToString() & Environment.NewLine() Loop Until stackFrames(index).GetMethod().Name = "Main" traceSource.TraceEvent(TraceEventType.Information, 1, callstack) End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Op de console verschijnt het volgende : Console Application Output myTraceSource Information: 1 : Void Method2()
Void Method1()
Void Main() Void wijst er hier op dat het gaat om procedures ( Subs ). boven
31.10.2. TraceOptions.LogicalOperationStackOm meer een eigen stack van operations te tracen kan je gebruik maken van de Trace.CorrelationManager en de TraceOptions.LogicalOperationStack van de listeners : Visual Basic 2010 Broncode Imports System.Diagnostics # Const TRACE = TrueClass ExampleWithListenerTraceOutputOptionLogicalOperationStack Private Shared traceSource As TraceSource Public Shared Sub Main() traceSource = New TraceSource( "myTraceSource", SourceLevels.All) traceSource.Listeners.Clear() Dim traceListener As TraceListener = New ConsoleTraceListener traceListener.TraceOutputOptions = TraceOptions.LogicalOperationStack traceSource.Listeners.Add(traceListener) Trace.CorrelationManager.StartLogicalOperation( "Initial Operation") traceSource.TraceEvent(TraceEventType.Information, 1, "Initial Message") MethodX() Trace.CorrelationManager.StopLogicalOperation() Console.ReadLine() End Sub Public Shared Sub MethodX() Trace.CorrelationManager.StartLogicalOperation( "Operation X") traceSource.TraceEvent(TraceEventType.Information, 1, "Message X") MethodY() Trace.CorrelationManager.StopLogicalOperation() End Sub Public Shared Sub MethodY() Trace.CorrelationManager.StartLogicalOperation( "Operation Y") traceSource.TraceEvent(TraceEventType.Information, 1, "Message Y") Trace.CorrelationManager.StopLogicalOperation() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Op de console verschijnt het volgende : Console Application Output myTraceSource Information: 1 : Initial Message
LogicalOperationStack=Initial Operation
myTraceSource Information: 1 : Message X
LogicalOperationStack=Operation X, Initial Operation
myTraceSource Information: 1 : Message Y
LogicalOperationStack=Operation Y, Operation X, Initial OperationMerk op dat de LogicalOperationStack in omgekeerde volgorde weergeeft welke operatie door welke andere is aangeroepen.
Hier wordt de LogicalOperationStack opgevuld met operaties die corresponderen met methodcalls, maar dat hoeft uiteraard niet persé zo te zijn.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|