Despite their limitations, the simple flat-memory models of legacy home grown and commercial embedded operating systems are usually easy to debug. Debugging an embedded Linux system, where MMU translations are enabled and context switches across user modes are permitted at any time, requires new methods. This paper will discuss the challenges of debugging multi-threaded embedded Linux applications as well as the Linux kernel and device drivers. Techniques for debugging individual threads, processes, loadable kernel modules, and new hardware will be presented.