Um ICE (Em-Circuit Emulator) substitui o chip de destino. Ele age como o chip real do restante do circuito, mas possui todos os tipos de ganchos internos para que você possa ver o que está acontecendo, definir pontos de interrupção, carregar novo código, pegar traços, etc. Um ICD (In-Circuit Debugger) usa hardware de depuração especial adicionado ao chip de destino para esse fim e tenta fornecer a você capacidade semelhante ao ICE. Infelizmente, o pessoal de marketing se envolveu e tentou redefinir esses termos de longa data na tentativa de enganar você a pensar que o produto deles é melhor que o próximo. O RealIce da Microchip é um exemplo particularmente flagrante disso. É real, mas a única coisa que não é é um ICE.
Um ICE real (não o RealIce) é o melhor ambiente de depuração no circuito. Infelizmente, eles praticamente desapareceram por causa do alto custo de fazer uma versão especial do chip de destino para uso no ICE, e o fato de as velocidades terem ficado tão altas que tirar qualquer coisa do chip é problemático. Outro problema é que um ICE exige que o chip de destino esteja em um soquete ou requer um adaptador especial montado no lugar do chip de destino para que o ICE possa se conectar às suas linhas.
Hoje, estamos presos aos CDIs. Felizmente, eles fazem a maioria das coisas que você gostaria de fazer com um ICE. Eles ainda têm uma vantagem em que o código está sendo executado no chip de destino real, não em algo que tenta ser como o chip de destino. A desvantagem é que eles exigem recursos no chip, portanto, não são completamente transparentes ao seu código e hardware como um ICE. O ICD precisa acessar linhas de depuração, que geralmente podem ter várias funções. Você não pode usar esses pinos em outras funções durante a depuração. A quantidade de circuitos de depuração incorporada em cada parte deve ser mantida em uma pequena fração do total, caso contrário o custo seria muito alto, portanto, os recursos precisam ser comprometidos. Um recurso interessante que seria muito caro adicionar em todos os chips é a capacidade de rastreamento real, pois isso requer um grande buffer de RAM.
Todo problema pode ser resolvido com uma variedade de ferramentas. Não é se você pode resolvê-lo, mas quanto tempo e quanto esforço é necessário. Quando eu usava ICEs regularmente (Microchip ICE-2000 e ICE-4000), não usava o recurso de rastreamento com frequência, mas quando usava outros meios teria sido significativamente mais caro. Às vezes, você tem um erro em que uma variável repentinamente tem o valor errado. Você percorre o código e está tudo bem, e a rotina que manipula a variável parece fazer tudo certo, mas quando você a executa, eventualmente as coisas são ruins e você encontra essa variável na lixeira. A causa é algum outro código com um ponteiro incorreto, estouro de buffer, incompatibilidade de pilha ou algo semelhante. Com um ICE, você pode definir um ponto de interrupção na variável que está sendo alterada,
Na maioria das vezes, um CDI se sai bem o suficiente. Especialmente com chips grandes, os dois pinos dedicados à depuração não são um grande problema. Atualmente, uso principalmente o RealIce para depuração. É muito mais estável e menos esquisito que o ICD2. Você aprende a viver com isso.