Подтвердить что ты не робот

Как просмотреть значение переменной <optimized out> в С++?

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

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

int x = floor(sqrt(3));

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}

Ответ 3

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