Сборка: debug или release?

Ноябрь 8, 2007

Как проверить была ли сборка (assembly) скомпилирована как debug or release? Если debug, то в аттрибуты сборки добавляется DebuggableAttribute c параметрами (смотрел рефлектором):

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]

Зацитирую Рихтера:

Однако когда приложение работает в отладчике или когда сборка помечена атрибутом System. Diagnostics. DebuggableAttribute, у которого в конструкторе параметр isJlTOptimizerDisabled равен true, JIT-компилятор
продлевает жизнь всех переменных (размерных и ссылочных типов) до конца их сферы действия, границей которой обычно является конец метода (кстати, у компилятора Microsoft C# есть переключатель командной строки /debug, добавляющий к сборке атрибут DebuggableAttribute, устанавливая параметр isJITOptimizerDisabled как true). Это не дает сборщику уничтожать ссылочные объекты во время исполнения кода в пределах сферы действия, что полезно при отладке. Было бы весьма неприятно, если б, вызвав метод объекта, вы получили неверный результат и при этом не имели бы возможность даже взглянуть на сам объект!

В случае с release все атрибуты опускаются:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

А как программно проверить как-то так:

 

static Assembly assemb = Assembly.LoadFile(Path.GetFullPath(fileName));
    static bool isDebug = false;
    foreach (object att in assemb.GetCustomAttributes(false))
    if (att is DebuggableAttribute)
          isDebug = ((DebuggableAttribute)att).IsJITTrackingEnabled;
    Console.WriteLine(“Assembly is {0}.”, isDebug ? “debug” : “release”);

IsJITTrackingEnabled — возращает тру, если дебаггер отслеживает информацию во время компиляции (code generation)

Update: нашлось полноценное решение — http://blogs.msdn.com/jb/archive/2006/06/14/631469.aspx

PS(рассчитывайте свои силы =): Было вчера. Было на самом деле. На часах 21.45. Я стою на остановке и жду маршрутку, чтобы уехать домой. Маршруток нет. На улице уже дубак. Вдруг из далека появляется ПАЗик, но не мой маршрут. Также вдруг и также из далека со всех ног парень ломиться чтобы успеть сесть в этот автобус. Бежать около 70 метров. Когда автобус только остановился на остановке он пробежал только половину пути. И я вижу что он опять прибавляет в скорости. Но =). В итоге он поравнялся с автобусом, когда тот проехал уже 5 метров от остановки. Автобус не остановился. Это первая неудача парня =). С возгласом: «Сука бля…» парень проходит мимо меня, возвращаясь на остановку. И видит на остановке одиноко стоящую пивную пустую стеклянную бутылку. И решает возместить всю злость на ней =). Разбегается и херачит по ней ногой со всей дури, как в футболе вратарь выбивает от ворот. Бутылка летит вверх. И тут я вижу, что вслед за бутылкой вверх полетел еще один предмет =). Сморю на парня, а он стоит на одной ноге, а вторая без ботинка smile_teeth. В итоге бутылка не разбилась, а ботинок улетел на метров 10. И он на одной ноге поскакал за этим ботинком =). Это вторя неудача парня =). Я потом ехал и смеялся, вспоминая как летел его ботинок…

…а музыка была: Машина времени — Я сюда еще вернусь

Один ответ to “Сборка: debug или release?”


Comments are closed.