Да, оптимизированный код менее отлаживаем. Мало того, что некоторая информация отсутствует, некоторая информация будет вводить в заблуждение.
Самая большая проблема, на мой взгляд, это локальные переменные. Компилятор может использовать один и тот же адрес стека или зарегистрироваться для нескольких переменных в функции. Как упоминалось в других постерах, иногда даже выяснение, что такое указатель "this", может занять некоторое время. При отладке оптимизированного кода вы можете увидеть текущую строку, скачущую за один шаг, поскольку компилятор реорганизовал сгенерированный код. Если вы используете PGO, этот прыжок, скорее всего, только ухудшится.
FPO не должен слишком сильно влиять на возможность отладки, если у вас есть PDB, поскольку PDB содержит всю информацию, необходимую для размотки стека для кадров FPO. FPO может быть проблемой при использовании инструментов, которые должны выполнять трассировку стека без символов. Для многих проектов преимущество FPO в настоящее время не превышает возможности диагностики; по этой причине MS решила не собирать Windows Vista с оптимизацией FPO (http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx).
Я предпочитаю отлаживать неоптимизированный код, но это не всегда возможно - некоторые проблемы воспроизводятся только с оптимизированным кодом, аварийные дампы клиентов взяты из выпущенной сборки, и иногда развертывание отладочной приватной информации невозможно. Часто при отладке оптимизированного кода я использую представление дизассемблирования - дизассемблирование никогда не лжет.
Это все относится к windbg, так как я делаю с ним отладку всего нативного кода. Отладчик Visual Studio может лучше обрабатывать некоторые из этих случаев.