локальные переменные в конструкторах не отслеживаются. Это ошибка в GDB?

StackOverflow https://stackoverflow.com/questions/224090

  •  03-07-2019
  •  | 
  •  

Вопрос

В настоящее время я использую GDB версии 6.7.1 в Ubuntu Linux и работаю в проекте C ++.

Удивительно, но я пытался отладить конструктор и обнаружил, что локальные переменные, объявленные в рамках конструктора, не отслеживаются и не замечаются gdb. Это ошибка?

Спасибо за любую информацию.

Это было полезно?

Решение

Это ошибка в GCC, а не в GDB.

Недавно он был исправлен .

Другие советы

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

Обратите внимание, что даже при «без оптимизации» некоторые тривиальные оптимизации все еще выполняются, но они не должны сильно мешать отладке. Кроме того, при интенсивном использовании C ++ (включая STL) ваша программа может стать намного медленнее без оптимизации.

Похоже, вы отлаживаете оптимизированную сборку.

Отладчик «знает» значение ваших локальных переменных, потому что файл символов описывает их расположение в кадре стека функций.

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

Для оптимизированной сборки компилятор часто делает вывод, что эти шаги не нужны, и сохраняет значение в регистре процессора столько времени, сколько необходимо. Вполне возможно, что локальная переменная вообще не получает значения, записанного в стек. В этом случае отладчик не может отслеживать значение переменной, но также не знает об этом и часто сообщает о данных из стека, как если бы это было значение переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top