Naja, Software Debugging, so wie Thorsten es beschrieben hat,
funktioniert nur, solange das Programm nicht völlig in den Wald rennt
und keine unvorhergesehenen Ereignisse eintreten.
Außerdem wird dadurch das zu testende Programm verändert (da ja an
strategischen Stellen Debugausgaben erfolgen müssen), was sowohl
Codegröße, Speichernutzung als auch das Laufzeitverhalten beeinflusst
und so Programmfehler "zudecken" kann.
Auf diese Art und Weise nach Fehlern zu suchen, ist sehr umständlich
und ziemlich ineffizient.
Übertragen auf die Programmierung auf einem PC entspricht das übrigens
der Programmentwicklung ohne eigenständigen Debugger.
Hardware-Debugging bedeutet, daß das Programm, egal in welchem Zustand
es sich befindet, angehalten werden kann und Speicherinhalte und
ähnliches untersucht werden können.
Dabei sind -je nach Debughardware- auch sehr "mächtige" Debughilfen
wie konditionale Breakpoints möglich:
das Programm wird angehalten, wenn eine bestimmte Bedingung zutrifft;
wenn beispielsweise eine Speicherzelle einen bestimmten Wert annimmt,
unabhängig davon, an welcher Stelle sich das Programm gerade befindet.
Damit sind beispielsweise Pointerfehler lokalisierbar.
Bei neueren Controllern ist "in circuit debugging" ohne spezielle
Emulationshardware möglich; erforderlich ist nur noch ein
JTAG-Interface und geeignete Software.
Einige AVRs besitzen ein solches Interface; die MSP430-Familie von TI
bietet JTAG-Unterstüzung und größere Controller wie beispielsweise die
aus der ARM-Familie haben so etwas in der Regel auch.