My development environment is Linux, the avr-gcc toolchain and avrdude/avrispmkii to program (in C/C++) my AVR chip (actually the Axon II Atmega640). I have used simulavr with avr-gdb - it works but is flaky (crashes a lot when trying to read/write some of the PINs).
So I've since resorted to changing a couple of lines of code, compiling, reprogramming and verifying functionality via UART rprintfs.
How does everyone else debug their AVR C/C++ programs? Is there a "best practice" FAQ?
(I know about using JTAG to debug directly with the AVR but I wish to avoid dropping money on more HW.)