When you leave the safety of the Arduino development environment and move to development with Atmel AVR processors, without an IDE, you lose some debugging / printing capabilities. However, there is a simple technique to recover some functionality. This is not a replacement for real debugging tools, but rather a quick fix for simple print capability. I develop in an OS X environment with Emacs as my editor, avr-gcc as my compiler, and avrdude to download the compiled code to the AVR processor via an AVRISP mark II device.
Now, the simple hack. You take an Arduino and make it a slave SPI device that reads data from the SPI bus when it is selected, and uses the Arduino’s Serial.print() capability to print the data over the USB port to the Arduino console.
You now set up the AVR microcontroller to act as an SPI master and create print functions that meet your specific needs. For example, code could select the debug device, send a byte of data over the SPI bus, and deselect the debug device. When the Arduino receives the byte of data, it is displayed on the Arduino console, our new debug window.
The simple byte print function described above can now be used to create additional functions, such as printStr(). As I said, a simple hack to solve a simple problem.