Как мне оценить ценностьпеременная в C ++? - PullRequest
34 голосов
/ 03 февраля 2012

Я использую gdb для отладки программы на C ++.

У меня есть этот код:

int x = floor(sqrt(3));

и я хочу посмотреть значение х. Однако GDB утверждает, что x равен "". Как мне посмотреть значение х? Должен ли я изменить флаги моего компилятора?

Ответы [ 3 ]

38 голосов
/ 03 февраля 2012

На высоких уровнях оптимизации компилятор может исключать промежуточные значения, как вы видели здесь.Существует несколько вариантов:

  • Вы можете уменьшить уровень оптимизации, чтобы отладчику было легче отслеживать вещи.-O0 наверняка будет работать (но будет намного медленнее), -O1 также может нормально работать.
  • Вы можете добавить некоторые явные операторы печати для регистрации выходного значения.
  • Вы также можете обычно заставить компилятор сохранять это конкретное значение, делая его изменчивым (но не забудьте отключить его, когда закончите!)Обратите внимание, однако, что поскольку поток управления также подвержен изменениям в оптимизированном коде, даже если вы видите значение переменной, может быть не совсем понятно, в какой точке кода вы находитесь, когда смотрите нарассматриваемая переменная.
14 голосов
/ 03 февраля 2012

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

Кроме того, в последних версиях GCC вы можете отключить оптимизацию только для функции, например:

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}
0 голосов
/ 10 апреля 2013

Создайте свою собственную «глобальную переменную» и напечатайте оптимизированную переменную в эту глобальную переменную.Обязательно удалите созданные вами глобальные переменные после завершения отладки!

...