It's the best of jobs and the worst of jobs. The worst, because our tools plug into literally thousands of target systems, and, whether the user's target is carefully designed or just hacked together, our units must work perfectly. Where the typical engineer or programmer might work on only Two or three systems a year, we get involved in hundreds. Despite the evolution in processors, tools, and applications over the years, the same handful of problems keep cropping up. It's unfortunate that the embedded design world is polarizing into distinct hardware and software camps.
Any emulator tries to be all things to all people.
In fact, while most ICEs will work in most systems, no emulator will run in every target. You can avoid many of the problems by considering the limitations inherent in any emulator before building hardware, writing disks of undebuggable code, or selecting your language tools. Most programmers developing embedded code for 16 and 32 bit processors seem to understand the need for some sort of source level debugger. Many 8 bit users are not so well informed. Remember that in a sense the emulator itself just provides the low level hardware resources you'll need.