Точки останова настроек ошибок, но только в некоторых строках при отладке - PullRequest
2 голосов
/ 20 декабря 2011

Эта строка вызывает «ключ не найден» в коллекции PostEntityImages.

Entity pimage = _context.PostEntityImages["postcreate"];

Когда я ставлю точку останова на этой строке и помещаю ее в окно просмотра, она работает нормально, и этот ключ присутствует .

ОБНОВЛЕНИЕ:

protected override void ExecutePlugin()
{

try
{
    Entity pimage = null;
    if (_context.PostEntityImages.ContainsKey("postcreate"))
        pimage = _context.PostEntityImages["postcreate"];
}
catch (Exception)
{
    // Never hits this line
    throw;
}
} // When stepping in/over the line assigning pimage, execution will jump to this point, then be caught in the catch block of this methods caller.

ОБНОВЛЕНИЕ № 2:

В режиме отладки некоторые контрольные точки установлены нормально. Другие выдают ошибку «Следующая точка останова не может быть установлена:»

1 Ответ

5 голосов
/ 20 декабря 2011

Точка останова и одношаговое поведение, которое вы описываете, обычно вызваны попыткой отладки вашего проекта в конфигурации сборки "Release". В обоих случаях вы, скорее всего, столкнетесь со случаями, когда компилятор оптимизировал строки кода, потому что они не имеют значения.

Например, если у вас есть следующий код:

try
{
  throw new ArgumentNullException("foo");
}
catch
{
  var x = 0;
  throw;
}

Блок catch выше бесполезен, и анализ потока компилятора достаточно умен, чтобы определить, что его можно безопасно оптимизировать. Если бы вы проходили по коду при запуске такой оптимизированной сборки, он просто пропустил бы прямо ваш обработчик исключений и переключился на обработчики исключений вызывающего. Это также приводило бы к странным ошибкам при установке точек останова, особенно если вы пытались установить их на оптимизированной линии, когда ваша программа уже была отлажена.

В отладочной неоптимизированной сборке компилятор будет хранить операторы, которые в противном случае были бы бессмысленными (например, присваивать значения переменной, которая никогда больше не будет использоваться), особенно потому, что они являются полезными инструментами отладки.

Убедитесь, что в используемой вами конфигурации сборки не установлен флажок «Оптимизировать код» в свойствах проекта «Сборка». Обратите внимание, что имя конфигурации не имеет смысла для VS - если вы называете конфигурацию сборки вашего проекта «Отладка», но включаете оптимизацию, вы получаете неотлаживаемую сборку.

...