An in-circuit emulator (ICE) is a hardware device used during the development of embedded systems. Virtually all such systems have a hardware element, and a separate software element, but which elements nevertheless are tightly interdependent. The ICE allows the software element to be run and tested on the actual hardware on which it is to run, but still allowing programmer conveniences such as source-level debugging and single-stepping, etc. Without an ICE, the development of embedded systems can be made extremely difficult, since if something does not function correctly, it is often very hard to tell what went wrong without some sort of monitoring system to oversee it.

Most ICEs consist of an adaptor unit which sits between the host computer and the system to be tested. A large header and cable assembly connects this unit to where the actual CPU or microcontroller mounts within the system to be tested. The unit emulates the CPU, such that from the system's point of view, it has a real processor fitted. From the host computer's point of view, the system under test is under full control, allowing the developer to debug and test code directly.

Most host systems are themselves unrelated to the CPU used for development - for example, a Windows PC might be used to develop software for a system using a Motorola 68HC11 chip, which itself could not run Windows. The host system uses a cross compiler or cross assembler to do this.