Comment savoir si une dll .NET est en DEBUG ou RELEASE…

…sans sortir l’artillerie lourde comme une prise de dumps et WinDbg ?

--

La question n’est pas aussi triviale qu’il y parait et m’a souvent été posée.

Pour y répondre, j’ai utilisé plusieurs méthodes plus ou moins fiable au fur et à mesure des années. Par exemple, au début, je vérifiais si j’avais un attribut de type "DebuggableAttribute" dans le manifeste avec ILDASM.EXE :

DebuggableAttribute

 

Ensuite, REFLECTOR.EXE m’a donné plus d’informations en m’indiquant les valeurs de cet attribut (sous format lisible Sourire) :

DebuggableAttribute

Voici les explications MSDN sur ces valeurs - https://msdn.microsoft.com/en-us/library/system.diagnostics.debuggableattribute.debuggingmodes.aspx

 

Néanmoins, je n’étais pas entièrement satisfait car ces attributs nous indiquent surtout si nous pouvons déboguer le code. Il est donc possible que nous n’ayons pas ces attributs et que la dll soit en néanmoins en DEBUG : c’est à dire "non optimisée" pour la production car des actions/allocations supplémentaires sont faits afin de fournir le maximum d’information au développeur lors du débogage.

Après plusieurs recherches et tests, j’ai découvert la propriété "IsJITTrackingEnabled" (qui n’est pas visible dans ILDASM et REFLECTOR). Avec cette propriété, nous tenons bien l’information qui indique au CLR de "faire du travail supplémentaire" pour le débogage. Je suis confiant sur le fait que si nous n’avons pas cette propriété, nous sommes en RELEASE !

Voici un exemple de code pour tester vos DLLs ou EXEs :

using System; using System.Collections.Generic; using System.Text; // Reflection and Diagnostics sont necessaire pour pouvoir charger l'assembly et récupérer l'attribut de Debug using System.Reflection; using System.Diagnostics;

namespace FindDebugModules { class Program { static void Main(string[] args) {

if (args.Length != 0) { string ModuleToTest = args[0];

Assembly assemblyToTest; try { assemblyToTest = Assembly.LoadFile(ModuleToTest); object[] o = assemblyToTest.GetCustomAttributes(typeof(DebuggableAttribute), false); assemblyToTest = null;

if (o.Length != 0) { bool debugActivated = ((DebuggableAttribute)o[0]).IsJITTrackingEnabled; Console.WriteLine("--> DebuggableAttribute set and IsJITTrackingEnabled = " + debugActivated); } else { Console.WriteLine("--> DebuggableAttribute not set"); } } catch (Exception ex) { Console.WriteLine("Error loading the assembly / getting the attibute"); } finally { assemblyToTest = null; } } }

} }

 

Bonne utilisation,

Sebastien.