Debugging and Tracing in ASP.NET (3/4)

Debugging and Tracing in ASP.NET

System.Diagnostics.Debug

This class provides methods for writing debugging output and validating assertions. It has
an Assert and Fail method with multiple signatures to suit different
situations. The methods of this class are defined with the Conditional attribute
discussed earlier. So the compiler variable DEBUG must be defined for these
methods to be called. In Visual Studio .NET DEBUG is defined by default during
debug builds. Thus, the use of the methods of this class does not affect performance or size
of release builds.

When debugging output is written using the four different Write methods in
this class they go to all the listeners that are registered with this class. All listeners
that can trace debug output inherit from TraceListener, which is an abstract
class. There are three concrete listeners that inherit TraceListener. The first
listener, which is always registered by default, is the DefaultTraceListener. This
prints the output to the debugger log during debugging. The second concrete listener is
EventLogTraceListener. This directs its output to an event log. The third
concrete listener is the TextWriterTraceListener. This prints its output to a
text file.

When controlling the debugging trace with a BooleanSwitch we have two
options. One is to use an if...else statement as shown below.

if(traceflag.Enabled)
{
Debug.Write("Some debugging ouput");
}

The other is to use the provided WriteIf methods of the Debug class.

Debug.WriteIf(debug.Enabled, "Some debugging ouput");

Given these two options it is always better to use the if...else structure for
performance reasons. When the traceflag is disabled the call to Write
is never performed. However, in the second construct the boolean check and the call is always
performed. Thus, for all practical purposes the Write methods should be used
exclusively.

Setting the appropriate properties of the Debug class can control the format
of the debugging output. While all properties and listeners can be added in code it is best
that they are done in the config file. This allows for changes without recompilation. The
example config file shown above can be modified to add a text file log and fix some formatting
options as shown below.

System.Diagnostics.StackTrace

Many times it is helpful to print out the call stack. This class provides the relevant
functionality. Unlike Java where a stack trace can only be obtained for an exception by
calling the printStackTrace method, the .NET framework provides the ability to
construct a stack trace anywhere in the code by constructing a new instance of the
StackTrace object. The call stack pertaining to an exception can also be
generated using the appropriate constructor. Once the StackTrace object has
been created the content can be printed out for observation.

A StackTrace object is essentially a collection of
System.Diagnostics.StackFrame objects. Each StackFrame object
contains information about one call. The StackTrace object exposes this
collection using the FrameCount property and the GetFrame method.

The following code prints out the call stack using the StackTrace and
StackFrame class.