Отладчик VS2017 C ++ пропускает строки кода - PullRequest
0 голосов
/ 18 апреля 2019

Я сделал быстрый поиск и не нашел ничего похожего на этот вопрос. Может быть, я не знаю, как искать это, извините.

Я недавно перешел на VS2017 (версия для сообщества) с VS2015. Я участвую в проекте, где я разрабатываю на C ++. Иногда мне нужно отладить, как обычно.

Я заметил, что отладчик на VS2017 не работает, как на версии 2015 года. Я не знаю, если это проблема конфигурации.

Проблема в том, что Step over, Step Into, Step Out не работают ожидаемым образом (выполнить строку кода и перейти к следующей / etc). Я загрузил здесь несколько скриншотов поведения отладчика: https://imgur.com/a/FZSMFSJ

Просто нажав F10 (Step Over), отладчик перемещается в этом направлении (строка 222-> 239-> 242-> 244-> 248-> 244-> 248-> 254), пропуская строки кода между ними, даже перемещаясь вперед и назад.

Как видно на других изображениях, точка останова работает нормально, и есть 2 типа «индикаторов линии отладки» с разными сообщениями.

Как настроить параметры VS для получения требуемой отладки?

1 Ответ

2 голосов
/ 18 апреля 2019

Когда оптимизация включена, компилятор может оптимизировать некоторые части кода.Например, выполнение избыточного назначения.Однако, даже если все оптимизации отключены, стандарт C ++ требует определенных оптимизаций (например, некоторые формы инициализации объекта RVO).

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

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

...