Точка останова и одношаговое поведение, которое вы описываете, обычно вызваны попыткой отладки вашего проекта в конфигурации сборки "Release". В обоих случаях вы, скорее всего, столкнетесь со случаями, когда компилятор оптимизировал строки кода, потому что они не имеют значения.
Например, если у вас есть следующий код:
try
{
throw new ArgumentNullException("foo");
}
catch
{
var x = 0;
throw;
}
Блок catch
выше бесполезен, и анализ потока компилятора достаточно умен, чтобы определить, что его можно безопасно оптимизировать. Если бы вы проходили по коду при запуске такой оптимизированной сборки, он просто пропустил бы прямо ваш обработчик исключений и переключился на обработчики исключений вызывающего. Это также приводило бы к странным ошибкам при установке точек останова, особенно если вы пытались установить их на оптимизированной линии, когда ваша программа уже была отлажена.
В отладочной неоптимизированной сборке компилятор будет хранить операторы, которые в противном случае были бы бессмысленными (например, присваивать значения переменной, которая никогда больше не будет использоваться), особенно потому, что они являются полезными инструментами отладки.
Убедитесь, что в используемой вами конфигурации сборки не установлен флажок «Оптимизировать код» в свойствах проекта «Сборка». Обратите внимание, что имя конфигурации не имеет смысла для VS - если вы называете конфигурацию сборки вашего проекта «Отладка», но включаете оптимизацию, вы получаете неотлаживаемую сборку.