QUOTE (a9d @ Jul 21 2011, 07:39)

DEBUG - это отключение оптимизации и добавление отладочной информации.
В таком случае - в топку такой DEBUG. Включите добавление отладочной информации вручную. С оптимизацией это будет уже другой код, который, как вы пишете далее:
QUOTE (a9d @ Jul 21 2011, 07:39)

выкинуть строки кода на которых стоит бряка, избавиться от некоторых переменных
Компилятор выкидывает только ненужное. Если он выкинул то, что вы считаете нужным - 99.9% ошибка у вас в коде.
QUOTE (a9d @ Jul 21 2011, 07:39)

и пошаговая трассировка будет работать неверно.
Работет верно. Не нужно ожидать отражения каждого чиха вашего исходника в ассемблере. А в целом программа делает то, что попросил программист (но не всегда то, что он хотел

). Пример:
CODE
int a = 1;
int b = 2;
int c = a + b;
PORTD = c * b;
При включенной оптимизации вы не увидете в ассемблере следов ни a, ни b, ни c. Но в PORTD будет записано число 6. Программа выполнила то, что вы задумали? Да. Оптимальнее, чем вы написали? Да. Какие претензии?
QUOTE (a9d @ Jul 21 2011, 07:39)

Также включил слежение за прерываниями. Во время работы срабатывает только TIMER0_OVF(Timer/Counter0 Overflow).
В топку протеус.
CODE
INLINE inline void RaiseContextSwitch() { SPM_CONTROL_REG |= (1 << SPMIE); }
QUOTE
When the SPMIE bit is written to one, and the I-bit in the Status Register is set (one), the SPM ready interrupt will be enabled. The SPM ready Interrupt will be executed as long as the SPMEN bit in the SPMCSR Register is cleared.
SPMEN нигде не устанавливается, прерывание SPM должно вызываться. Даже если бы был выставлен бит SPMEN он должен был бы сброситься через 4 такта, после чего - см. цитату выше. Все.