Я заметил, что когда я компилирую код с помощью GCC -Og
, GDB часто не может определить значение переменных во время точек останова, потому что они "оптимизированы". Я знаю, что информация существует в той или иной форме, так как результат программы зависит от ее значения.
С другой стороны, я никогда не видел, чтобы это случилось с OpenJDK, который способен очень хорошо компилировать код как для производительности, так и для целей отладки.
Почему такая разница существует?
Я думаю, что оба компилятора позволяют устанавливать точки останова в произвольных местах кода, даже если код был оптимизирован, встроен и т. Д. Я подозреваю следующие возможности:
- GCC просто отслеживает меньше информации о преобразованной программе (но почему?)
- JVM создает более медленный код, который легче отслеживать
- JVM деоптимизирует (также деинлайн) код, когда вставлена точка останова
- В этом случае JVM имеет лучшую архитектуру компилятора
- Отладчик JVM фактически не отслеживает процесс