Машина времени стека вызовов в Visual Studio 2010 - PullRequest
1 голос
/ 17 июня 2011

Я знаю, что название немного амбициозно, но мне интересно, есть ли способ, после отображения предыдущего состояния в окне стека вызовов (Visual Studio 2010) при отладке программы на C #, перезапустить (например, при нажатии) Продолжайте "/ F5) оттуда.

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

Для реальной машины времени с ОО-кодом историческое состояние всех объектов должно быть сохранено в памяти, поэтому я сомневаюсь, что это возможно на данном этапе. Теперь, если состояние всех объектов не сильно изменилось, мы могли бы сохранить текущее состояние и вернуться назад во времени (в качестве ярлыка для выполнения того же действия с «редактировать и продолжить»).

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Иногда вы можете щелкнуть правой кнопкой мыши по кадру стека и выбрать «Развернуть здесь» (или очень похожую формулировку). Это не всегда возможно, и я не уверен, каковы необходимые условия, но я собираюсь сделать предположение относительно того, что могло бы предотвратить это:

  • Фрейм собственного кода в стеке вызовов в середине
  • Остановка в StackOverflowException (очевидно, смерть для процесса в любом случае)
  • Может быть, лямбда-выражения или другие вещи, которые мешают редактированию и продолжению работы (?)

В принципе, все "необычное".

Кроме этого, если это работает, тогда вы идете!

0 голосов
/ 17 июня 2011

Это немного глупо, но:

При просмотре предыдущего состояния в окне стека вызовов откройте окно разборки (Debug | Windows | Disassembly или CTRL + ALT + D). Теперь вы сможете создать точку останова, которая остановит выполнение, когда вы вернетесь в это место.

Если вам все равно, что еще выполняется, нажмите клавишу F5 и разрешите коду вернуться к новой точке останова.

Теперь щелкните правой кнопкой мыши оператор, с которого вы хотите перезапустить, и выберите «Установить следующий оператор». Нажмите F5, чтобы перезапустить оттуда.

Если вы заботитесь о том, что еще выполняется на пути к новой точке останова, вы можете использовать Set Next Statement, чтобы установить программный счетчик на конец функции, в которой вы находитесь, и использовать Shift + F11, чтобы выйти из этой функции. (таким образом, не выполняет какую-либо оставшуюся логику в этой функции). Повторяйте по мере необходимости, пока не вернетесь к новой точке останова.

Обратите внимание на различные мрачные предупреждения об использовании оператора Set Next

Редактировать 6/18 Когда я проверял вышеизложенное, я использовал Visual Studio 2010 Ultimate. Я только что проверил Visual Studio Express C #, и он не поддерживает окно отладки дизассемблирования. Когда я смогу, я проверю Visual Studio 2010 Professional и обновлю этот ответ снова. Если у вас установлена ​​Visual Studio Ultimate, то предложение @Hans от Intellitrace, возможно, будет лучшим выбором.

...