Машина времени стека вызовов в Visual Studio 2010
Я знаю, что название немного амбициозно, но мне интересно, есть ли способ, после отображения предыдущего состояния в окне стека вызовов (Visual Studio 2010) при отладке программы на C#, перезапустить (например, при нажатии "Продолжить"/F5) оттуда.
Это было бы особенно полезно для отладки лямбда-выражения, которое генерирует исключение, поскольку нет никакого способа выйти наружу.
Для реальной машины времени с ОО-кодом историческое состояние всех объектов должно быть сохранено в памяти, поэтому я сомневаюсь, что это возможно на данном этапе. Теперь, если состояние всех объектов не сильно изменилось, мы могли бы сохранить текущее состояние и вернуться назад во времени (в качестве ярлыка для выполнения того же действия с "редактировать и продолжить").
2 ответа
Иногда вы можете щелкнуть правой кнопкой мыши по кадру стека и выбрать "Развернуть здесь" (или очень похожую формулировку). Это не всегда возможно, и я не уверен, каковы необходимые условия, но я собираюсь сделать предположение относительно того, что могло бы предотвратить это:
- Фрейм нативного кода в стеке вызовов посередине
- Быть остановленным в StackruException (очевидно, смерть для процесса в любом случае)
- Может быть, лямбда-выражения или другие вещи, которые мешают редактированию и продолжению работы (?)
В принципе, ничего "необычного".
Кроме этого, если это работает, то вы идете!
Это немного глупо, но:
При просмотре предыдущего состояния в окне стека вызовов откройте окно дизассемблирования (Debug | Windows | Disassembly или CTRL+ALT+D). Теперь вы сможете создать точку останова, которая остановит выполнение, когда вы вернетесь в это место.
Если вам все равно, что еще выполняется, нажмите клавишу F5 и дайте коду вернуться к новой точке останова.
Теперь щелкните правой кнопкой мыши оператор, с которого вы хотите перезапустить, и выберите "Установить следующий оператор". Нажмите F5, чтобы перезапустить оттуда.
Если вам не безразлично, что еще выполняется на пути к новой точке останова, вы можете использовать Set Next Statement, чтобы установить счетчик программы на конец функции, в которой вы находитесь, и использовать Shift+F11, чтобы выйти из этой функции (таким образом, не выполнение любой из оставшихся логики в этой функции). Повторяйте по мере необходимости, пока не вернетесь к новой точке останова.
Обратите внимание на различные ужасные предупреждения об использовании Set Next Statement
Редактировать 6/18 Когда я проверял вышеизложенное, я использовал Visual Studio 2010 Ultimate. Я только что проверил Visual Studio Express C#, и он не поддерживает окно отладки дизассемблирования. Когда я смогу, я проверю Visual Studio 2010 Professional и обновлю этот ответ снова. Если у вас Visual Studio Ultimate, то, возможно, лучше подойдет предложение Intellitrace от @Hans.