Depende, e isso geralmente é verdade para todas as ferramentas, não apenas para o C30.
As otimizações geralmente removem e / ou reestruturam o código de várias maneiras. A instrução switch pode ser reimplementada com uma construção if / else ou, em alguns casos, pode ser removida por completo. y = x * 16 pode ser substituído por uma série de mudanças à esquerda, etc., embora esse último tipo de otimização ainda possa ser feito, geralmente é a reestruturação da instrução de controle que o recebe.
Isso pode impossibilitar a execução de um depurador no código C porque as estruturas que você definiu em C não existem mais, elas foram substituídas ou reordenadas pelo compilador em algo que o compilador acredita que será mais rápido ou ocupará menos espaço. Também pode tornar impossível definir pontos de interrupção a partir da listagem C, pois as instruções que você interrompeu podem não existir mais. Por exemplo, você pode tentar definir um ponto de interrupção dentro de uma instrução if, mas o compilador pode ter removido esse if. Você pode tentar definir um ponto de interrupção dentro de um loop while ou for, mas o compilador decidiu desenrolar esse loop para que ele não exista mais.
Por esse motivo, se você pode depurar com otimizações desativadas, geralmente é mais fácil. Você deve sempre testar novamente com as otimizações ativadas. Essa é a única maneira de descobrir que você perdeu um importante volatile
e está causando falhas intermitentes (ou alguma outra estranheza).
No caso de desenvolvimento incorporado, você deve ter cuidado com as otimizações de qualquer maneira. Especificamente em seções de código com tempo crítico, algumas interrupções, por exemplo. Nesses casos, você deve codificar os bits críticos no assembly ou usar diretivas do compilador para garantir que essas seções não sejam otimizadas, para que você saiba que eles têm um tempo de execução fixo ou um tempo de execução fixo no pior caso.
A outra pegadinha pode ser encaixar o código no uC. Você pode precisar de otimizações de densidade de código para simplesmente encaixar seu código no chip. Essa é uma das razões pelas quais geralmente é uma boa idéia começar com a maior capacidade de ROM uC de uma família e escolher apenas uma menor para fabricação, depois que seu código estiver bloqueado.