Introduction
The namespace System.Diagnostics
provides a set of attributes and classes to interact with the system process, events managers, performance counts, etc. This namespace
can help us too in debugging job.
Let’s review the useful actions inside of System.Diagnostics namespace
.
DebbugerDisplay Attribute
DebuggerDisplay
attribute drives the string
format with debug screen to show the value of: class, properties or fields.
For this same task, is best known override ToString
method, but using DebbugerDisplay
attribute is a better choice, because this not only modifies the data structure, only interacts with Visual Studio debbuger screen. Override ToString
method for only this purpose can create problems because many actions in .NET take this value for default, for example bindings in WPF.
This attribute supports delegates, properties, fields and assemblies.
Example:
[System.Diagnostics.DebuggerDisplay("{ID} - {Model}- {Manufacturer} - {ProductionDate}")]
public class Car
{
public int ID { get; set; }
public string Model { get; set; }
public string Manufacturer { get; set; }
public DateTime ProductionDate { get; set; }
}
DebuggerHidden Attribute
DebuggerHidden
attribute prevents the compiler stop in constructors, methods, properties and indexers declarations.
In mentioning this latter area, my comment might sound lightweight, but in practice, this can save time push key F11 in debugging.
Example:
[System.Diagnostics.DebuggerHidden]
public static List<Car> GetData()
{
var result = new List<Car>()
{
new Car{ ID = 1, Manufacturer = "Ford",
Model = "Mustang", ProductionDate = DateTime.Today },
new Car{ ID = 2, Manufacturer = "Nissan",
Model = "Micra" , ProductionDate = DateTime.Today }
};
return result;
}
Debugger.Launch
Occasionally, we can’t debug the code of a library, service, etc., because it isn’t accessible or we can’t add project to our solution. In this case, we can use the Debugger.Launch()
method and Visual Studio opens a debug window and we can debugger its code.
When executed, the line Systen.Diagnostics.Debbuger.Launch()
open a MessageBox
with the instance of Visual Studio Debugger Options:
In this window, we can choose if we open a new instance of Visual Studio (all versions) or if we re-use an existing instance.
And we can debug the code:
Conditional Attribute
Conditional attribute allows to indicate a condition to methods so that the compiler executes or does not execute its content.
We can use with the precompiler sentences as DEBUG
.
static void Main(string[] args)
{
DebugMethod();
Console.Read();
}
[System.Diagnostics.Conditional("DEBUG")]
public static void DebugMethod()
{
Console.WriteLine("Execute Debug Method");
}
Will only run if the Solutions Configurations is Debug.
It doesn’t exist a condition for RELEASE, therefore we will use a define
directives.
Define directives is another way to use System.Diagnostics.Conditional
:
using System;
namespace SystemDiagnosticsUsefulActions
{
class Program
{
static void Main(string[] args)
{
ReleaseMethod();
Console.Read();
}
[System.Diagnostics.Conditional("RELEASE_MODE")]
public static void ReleaseMethod()
{
Console.WriteLine("Execute Release Method");
}
}
}
Conclusion
These are the useful tips and traps of System.Diagnostics
. They are become very practical in many cases and I hope you find it helpful.