Как просмотреть значение переменной <optimized out> в С++?
Я использую gdb для отладки программы на С++.
У меня есть этот код:
int x = floor(sqrt(3));
и я хочу посмотреть значение x. Однако gdb утверждает, что x является "< optimized_out > ". Как просмотреть значение x? Должен ли я изменить свои флагов компилятора?
Ответы
Ответ 1
На высоких уровнях оптимизации компилятор может исключить промежуточные значения, как вы видели здесь. Существует несколько вариантов:
- Вы можете уменьшить уровень оптимизации, чтобы облегчить отладчику отслеживание вещей.
-O0
наверняка работает (но будет намного медленнее), -O1
может работать нормально.
- Вы можете добавить некоторые явные инструкции печати для регистрации выходного значения.
- Вы также можете заставить компилятор сохранить это конкретное значение, сделав его изменчивым (но не забудьте сделать его изменчивым, когда закончите!). Обратите внимание, однако, что, поскольку поток управления также подвержен изменению в оптимизированном коде, даже если вы можете увидеть значение переменной, может быть не совсем ясно, в какой точке кода вы находитесь, когда смотрите на переменная, о которой идет речь.
Ответ 2
Если вы не можете или не хотите отключать оптимизацию, попробуйте объявить переменную как volatile.
Обычно этого достаточно, чтобы ваш компилятор сохранил переменную в конечном коде.
В качестве альтернативы, в последних версиях GCC вы можете отключить оптимизацию только для функции, например:
void my_function() __attribute__((optimize(0)))
{
int x = floor(sqrt(3));
}
Ответ 3
Создайте собственную глобальную переменную и напечатайте оптимизированную переменную в этой глобальной переменной. Обязательно удалите эти глобальные переменные, созданные вами после завершения отладки!