При отладке в VS 2008 почему отладчик попадает во второй оператор return? - PullRequest
0 голосов
/ 30 апреля 2010

При отладке следующей консольной программы:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DoIt(false));

        Console.WriteLine(DoIt(true));
    }

    private static Boolean DoIt(Boolean abort)
    {
        try {
            throw new InvalidOperationException();
        } catch(Exception ex) {
            if (abort) {
                return true;
            }

            Console.WriteLine("Got here");
            return false;
        }
    }
}

Почему IDE попадает во второй оператор return во время второго вызова DoIt ()? Результаты выполнения верны, но опыт отладки вводит в заблуждение.

Это известная проблема?

Одинаково ли поведение в VS 2010?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2010

Если вы используете оптимизированную сборку, вполне возможно, что оптимизатор решил избавиться от одного из возвратов. Это довольно распространенная оптимизация (я понятия не имею, почему, я больше всего узнаю об оптимизаторах из наблюдений отладчиков, но то, что они делают, является магией, насколько я хочу знать :)) Когда это происходит, отладчик (или, более точно, тот, кто генерирует метаданные, которые использует отладчик, чтобы выяснить, в какой строке кода вы находитесь) должны выбрать одну из них, и в вашем примере она имеет пятьдесят на пятьдесят шансов ошибиться.

Несмотря на то, что это вводит в заблуждение, это лишь часть опыта отладки оптимизированного кода. Единственная альтернатива - не оптимизировать код, что не очень хорошо.

0 голосов
/ 01 мая 2010

Это недостаток в 64-битной версии JIT-компилятора.Похоже, что он не генерирует полностью правильные данные отображения отладки адреса машинного кода.Это лишь в некоторой степени точно: оператор return true действительно переходит к оператору return в конце метода.Но он должен был указывать на закрывающую скобку, а не на оператор return false.

Эта ошибка отсутствует в x86-версии JIT-компилятора.Обычно вы хотите использовать этот джиттер во время отладки, он поддерживает Edit + Continue.Проект + Свойства, вкладка «Построение», Цель платформы = x86.Это автоматически в VS2010 для новых проектов.

Вы можете сообщить об ошибке на connect.microsoft.com

0 голосов
/ 30 апреля 2010

в VS2010 этого не происходит. Первый вызов DoIt печатает Got здесь и попадает во второй возвратный статус. Второй вызов попадает в первый оператор возврата.

...