Подтвердить что ты не робот

Отладчик переходит в if() блок, где условие ложно

Учитывая этот драгоценный камень кода:

class Program
{
    private static bool IsAdmin = true;

    static void  Main(string[] args)
    {
        if (!IsAdmin)
        {
            throw new Exception();
        }

        try
        {
            var x = 2342342;
            var y = 123132;
        }
        catch (Exception)
        {
            throw;
        }
    }
}

Учитывая, что this.IsAdmin дает true - я бы ожидал, что отладчик не будет вводить этот оператор if. На самом деле это происходит - и он срабатывает над броском, но на самом деле не бросает!

Теперь это происходит только тогда, когда у вас есть исключение внутри оператора if, за которым следует блок try/catch, на Visual Studio 2013, ориентированный на .NET Framework 4, 64 бит, "Предпочитаете 32 бит", не установлен.

Я подтвердил эту странность коллегами на разных машинах. Шаг, хотя следующий код и отладчик, похоже, войдут в ветку if, но исключение не будет выбрано:

enter image description here

Я работаю в режиме отладки, я попытался несколько раз собрать и очистить проект.

Может кто-нибудь объяснить, почему это происходит?

4b9b3361

Ответ 1

Проверьте эту ссылку. Это известная ошибка в некоторых версиях Visual Studio и версии .NET Framework. Это совершенно безвредно, и вам придется с этим жить.

Ответ 2

Это известная проблема, вызванная джиттером x64, изредка генерирует плохую информацию о номере отладки. Он может ошибаться, когда оператор вызывает создание дополнительных инструкций NOPs, предназначенных для выравнивания кода. Первый NOP становится номером строки, а не инструкцией после NOP. Это байты в нескольких местах, как оператор throw после простого if() теста и использования оператор с простыми скалярными операндами. Эти выравнивающие NOP также являются причиной того, что так опасно прерывать потоки, описанные в этом сообщении.

Простейшим решением является проект + Свойства, вкладка "Сборка", отметьте опцию "Предпочитайте 32-разрядную", если таковая имеется, установите для платформы цель x86 иначе. Обратите внимание, что ничто не пошло не так, в то время как отладчик предполагает, что оператор throw будет выполнен, ваша программа фактически не генерирует исключение.

Работа над этим, джиттер x64 был сильно переписан, проект RyuJIT. Он будет отправлен в VS2015, в настоящее время в Preview.

Ответ 3

Просто сделайте Debug.Writeline(IsAdmin) перед оператором if.