Karl heinz Buchegger wrote:
> Damit schaltest du die Optimierung aus, sonst
> kommts zu seltsamen Effekten im Debugger, weil der Optimizer den Code
> komplett umkrempeln kann und wird.
Einziger Nachteil dieser Lösung: du debuggst zweimal. Das erste Mal
so, wie von Karl Heinz beschrieben. Beim zweiten Mal debuggst du
dann die Gemeinheiten (wie vergessene "volatile"s), die du erst mit
dem Optimizer siehst. Wohl oder übel musst du dich für den zweiten
Debuggerlauf dann durchbeißen, dass der Compiler da manches umgebaut
hat: bestimmte Variablen benötigst du für dein Verständnis und den
besseren Überblick, der Compiler benötigt sie aber nicht, sondern
rechnet vielleicht gleich drei Schritte weiter (die sogenannte "common
subexpression elimination") und speichert das Zwischenergebnis in
Registern. Das ist nicht immer einfach zu verfolgen, aber man
gewöhnt sich dran. Der AVR-Studio-Debugger ist in dieser Hinsicht
allerdings kein gutes Werkzeug, da er dir nicht die Eingabe beliebiger
C-Ausdrücke zur Bewertung gestattet. Was zum Beispiel ganz häufig
passiert, ist sowas:
1 | void myfunc(void *p)
|
2 | {
|
3 | struct something *sp = (struct something *)p;
|
4 |
|
5 | ...
|
6 | sp->ele1 = 42;
|
7 | ...
|
8 | }
|
In diesem Falle besitzt der Compiler den Hilfskonstrukt "sp" nicht
mehr, da du den nur als Programmierer für den strukturierten
Zugriff benötigst, der Compiler sich aber gleich daraus die
entsprechenden Offsets zu Adressen umrechnet. Folglich gibt's im
optimierten Code kein "sp" mehr, und AVR Studio hat nichts, was
es dir im Watch-Fenster anzeigen kann. Du musst dann umständlich
den Wert von "p" benutzen (den sollte auch AVR Studio kennen, der
würde im genannten Fall in den Registern r24/r25 stehen) und über
eine Speicheransicht deine Struktur angucken.
Andere Debugger gestatten beliebige C-Ausdrücke. In einem GDB
kann man daher sich den Hilfkonstrukt rein für den Debugger wieder
herstellen und schreiben:
1 | (gdb) print *(struct something *)p
|
Man könnte sogar eine Debugger-Hilfsvariable einführen:
1 | (gdb) set $sp = (struct something *)p
|
2 | (gdb) print *$sp
|