homelinksBlijf op de hoogte van de recente aanpassingen op vbvoorbeelden!
Visual Basic 2010 Voorbeelden

visual basic 2010 broncode voorbeelden

Microsoft Visual Studio 2010Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

31.10. TraceOptions.Callstack en LogicalOperationStack

Print Email Deel op Facebook Deel op Twitter

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.Callstack

Om 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 = True
Class 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 Sub
End Class
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 = True
Class 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 Sub
End Class
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 ).

31.10.2. TraceOptions.LogicalOperationStack

Om 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 = True
Class 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 Sub
End Class
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 Operation
Merk 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.