Often times, in debugging various ASP.NET memory related issues, I find numerous assemblies that have been compiled in debug mode. One of the main problems, however, is the person I'm working with is almost always the one responsible for getting the server back up and running, and not the developer that created the debug assembly that's actually deployed to the server in question.
So I whipped up a little console application that returns the details on an assembly that gets passed on the command line.
using System;
using System.Reflection;
using System.Diagnostics;
namespace IsModDebug
{
public class IsDbg
// Errorlevels, for batch reasons:
// 0 = Non-Debug Assembly
// 1 = Debug Assembly
// 2 = No assembly name passed on command line
// 4 = Exception thrown
public static int Main(String[] args)
if (args.Length != 1)
Console.WriteLine("\nError: Not enough command line options specified.");
Console.WriteLine("Usage: \"IsModDebug <path to assembly>\"");
return (2);
}
try
Assembly asm = Assembly.LoadFile(args[0], null);
DebuggableAttribute objDebuggable =
(DebuggableAttribute)DebuggableAttribute.GetCustomAttribute(asm, typeof(DebuggableAttribute));
if (objDebuggable == null)
Console.WriteLine("Non-Debug Assembly");
return (0);
if (objDebuggable.IsJITOptimizerDisabled || objDebuggable.IsJITTrackingEnabled)
Console.WriteLine("Debug Assembly");
Console.WriteLine("JITOptimizerDisabled = {0}", objDebuggable.IsJITOptimizerDisabled);
Console.WriteLine("IsJITTrackingEnabled = {0}", objDebuggable.IsJITTrackingEnabled);
catch (Exception e)
Console.WriteLine("Exception: {0}!!!", e.Message);
return (4);
return (1); // Debug Module Found
Output looks something like this, when run against various assemblies compiled in various ways:
C:\>ismoddebug d:\rel.exeNon-Debug Assembly
C:\>ismoddebug d:\deb.exeDebug AssemblyJITOptimizerDisabled = TrueIsJITTrackingEnabled = True
C:\>ismoddebug d:\deb2.exeDebug AssemblyJITOptimizerDisabled = FalseIsJITTrackingEnabled = True
Have Fun,