Forum: Compiler & IDEs Debug mit Variablen


von Steffen R. (reschi03)


Lesenswert?

Hallo Und Servus !
Nutze das AVR-Studio 4.13 und möchte nun den C-Code simulieren und mir 
dabei meine Variablen beobachten. Ich weiß, es gibt schon einige 
Beiträge dazu mit Einträgen im makefile. Bekomme das aber nicht 
gebacken. Wie mache ich das Schritt für Schritt. Habe schon mit dwarf-2 
und extcoff rumprobiert, bekomme aber keine Variablen zu sehen. Wenn ich 
im AVR-Studio mit "Build all" und dann mit PonyProg flashe, funktioniert 
auch meine Steuerung, brauchte also noch nie was mit den ominösen 
makefiles machen. Wer kann helfen ?
Gruß Reschi

von Karl H. (kbuchegg)


Lesenswert?

Du musst dich um das Makefile überhaupt nicht kümmern. Das erledigt 
AVR-Studio für dich. Blöd ist nur, dass du jetzt anscheinend schon 
rumgespielt hast. So wie AVR-Studio ein neues Projekt aus dem Stand 
heraus anlegt, so funktioniert das auch.

Anyway:
Geh auf den Menüpunkt 'Project'. Ganz unten sind die Project Options.
Da geht ein Dialog auf. In dem stellst du sicher, dass bei Optimierung 
-O0 eingestellt ist. Damit schaltest du die Optimierung aus, sonst 
kommts zu seltsamen Effekten im Debugger, weil der Optimizer den Code 
komplett umkrempeln kann und wird.

Dein Programm wird gestartet, indem du im Menü 'Debug' den Punkt Start 
auswählst. Mit F10 bzw. F11 (dazu gibts auch entsprechende Menüpunkte in 
'Debug') kannst du dein Programm einen Schritt machen lassen. Und ja, 
man kann sich selbstverständlich die Variablen anzeigen lassen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Steffen R. (reschi03)


Lesenswert?

Dank an die Moderatoren!
So weit alles begriffen und im Menüpunk mit der Optimierung ist auch 
alles o.k.
.
.
.
Mit F10 bzw. F11 (dazu gibts auch entsprechende Menüpunkte in
'Debug') kannst du dein Programm einen Schritt machen lassen. Und ja,
man kann sich selbstverständlich die Variablen anzeigen lassen.
.
.
.
!!! Genau bis hierher bin ich.
Außer die Register, IO-Ports, Laufzeit usw. sehe ich aber nichts. Hab 
schon mit "Watch" Versuche gemacht...Meldung 'not in scope'....
Habe z.B. eine Variable  'unsigned int Test=20'  erstellt und mein 
Programm bearbeitet dann diese Variable, wie kann ich d a s (z.B. mit 
F11 schrittweise) beobachten ??
Gruß Reschi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.