Hardware-based debuggers are a staple in the embedded Linux world. However, the ARM architecture supports several different flavors of hardware debugging including JTAG, SWD, SWO, CMSIS-DAP and more. What are the features of these debugger interfaces and how can you use them to debug low-level code such as drivers in the Linux kernel? In this session, we will describe each of these interfaces and how they are used with a live demonstration of OpenOCD and its use to debug Linux kernel code.