Forum: Compiler & IDEs "Optimized away" im Überwachenfenster des AtmelStudios


von Dieter (Gast)


Lesenswert?

Hallo zusammen,

ich möchte mit AtmelStudio 6.1 SP1 meinen AVR-Code debuggen. Bei 
angehaltenem Code (Breakpoint) möchte ich dann den Inhalt einer 
Variablen betrachten (großes Array) und ziehe diese ins 
Überwachen-Fenster. Dort erscheint dann "Optimized away". Ok, vermutlich 
wegoptimiert. Viele (aber nicht alle Variablen) werden scheinbar auch 
noch wegoptimiert.

Dann habe ich über AtmelStudio/Toolchain/Debugging "Maximum" -g3 und 
Optimization Level auf -O0 eingestellt und mir davon erhofft, dass sich 
alles bessert. Weit gefehlt - keine Änderung. Die Codegröße ändert sich 
von vormals ~7k auf ~11k. Also scheint der Schalter zu greifen - bewirkt 
aber nix.

Was mache ich falsch?

PS: "Volatile" ist keine Dauerlösung, da ich so quasi alles volatile 
machen müsste.

Danke.

von Jim M. (turboj)


Lesenswert?

Bist Du Dir sicher, dass der Compiler alles neu übersetzt hat? Bei -O0 
schreibt er IMO praktisch alles ins RAM weg.

Wird das Array im Code angefasst? Ansonsten könnte es auch vom Linker 
entfernt worden sein (--gc-sections).

von Dieter (Gast)


Lesenswert?

> Bist Du Dir sicher, dass der Compiler alles neu übersetzt hat?
ja, nochmal kontrolliert. Auch die avr-gcc.exe Aufrufe enthalten -DDEBUG 
-O0 usw.
Beispielzeile aus dem Ausgabefenster von AtmelStudio:
"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 
GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe" 
-funsigned-char -funsigned-bitfields -DDEBUG  -O0 -ffunction-sections 
-fdata-sections -fpack-struct -fshort-enums -g3 -Wall -mmcu=atmega328p 
-c -std=gnu99 -MD -MP -MF "Bios/BiosPorts.d" -MT"Bios/BiosPorts.d" 
-MT"Bios/BiosPorts.o"   -o "Bios/BiosPorts.o" "../Bios/BiosPorts.c"

> Wird das Array im Code angefasst?
Ja. Sowohl geschrieben (in BiosRs232.c), als auch an anderen Stellen 
gelesen (z.B. in ApplComm.c).

Eine der nicht funktionierenden Variablen wird im Modul BiosRs232.c 
angelegt und soll in ApplComm.c gelesen werden (und dort auch gedebugt). 
In ApplComm.c erscheint im Überwachenfenster nur "Error|Optimized away". 
Wenn ich aber in BiosRs232.c anhalte, kann ich den Inhalt der Variablen 
einsehen. Scheint also kein Optimierungsproblem zu sein?!?
Aber was sonst?

Übrigens, mit dem "PS:" aus meinem Ausgangspost wollte ich nicht 
aussagen, dass es mit volatile problemlos funktioniert, sondern nur dem 
Tip, volatile sei die Universallösung, begegnen... "volatile" 
funktioniert nämlich auch nicht, wie ich eben geprüft habe...

Noch ein Hinweis: Die fragliche Variable ist ein struct mit (u.a.) einem 
Array drin. Aber das sollte ja eigentlich auch keinen Einfluss haben?!?


Falls niemandem mehr hier etwas konkretes dazu einfällt, würde es mir 
auch helfen, wenn noch jemand dazu schreiben könnte, dass bisher solche 
Probleme gänzlich unbekannt sind (mit AtmelStudio) und ich der erste 
bin...

Danke.

von Fabian O. (xfr)


Lesenswert?

Dieter schrieb:
> Eine der nicht funktionierenden Variablen wird im Modul BiosRs232.c
> angelegt und soll in ApplComm.c gelesen werden (und dort auch gedebugt).
> In ApplComm.c erscheint im Überwachenfenster nur "Error|Optimized away".
> Wenn ich aber in BiosRs232.c anhalte, kann ich den Inhalt der Variablen
> einsehen. Scheint also kein Optimierungsproblem zu sein?!?
> Aber was sonst?

Zeig mal den Code. Vielleicht hast Du die Variable in beiden Modulen 
angelegt statt eine extern-Deklaration zu benutzen o.ä..

von Dieter (Gast)


Lesenswert?

Hallo zusammen,

ich habe jetzt mein Projekt auf ein Minimum runtergekürzt und das 
Problem tritt immernoch auf.
Ich wäre euch sehr dankbar, wenn ihr mir das Brett vom Kopf nehmen 
könntet. :-)

main.c:
1
#include <stdint.h>
2
3
int main(void);
4
extern void  BiosRs232_Task(void);
5
extern void  ApplComm_Task(void);
6
7
int main(void)
8
{
9
  while(1)
10
  {
11
    BiosRs232_Task();
12
    ApplComm_Task();
13
  }
14
  return (0);
15
}

ApplComm.c:
1
#include <stdint.h>
2
3
volatile uint32_t ApplComm_Debug1 = 1;
4
volatile uint32_t ApplComm_Debug2 = 1;
5
6
void ApplComm_Task(void)
7
{
8
    ApplComm_Debug1++;
9
  ApplComm_Debug2++;
10
}

BiosRs232.c:
1
#include <stdint.h>
2
3
extern volatile uint32_t ApplComm_Debug1;
4
//extern volatile uint32_t ApplComm_Debug2;
5
6
void BiosRs232_Task(void)
7
{
8
  ApplComm_Debug1--;
9
//  ApplComm_Debug2++;
10
}

Halte ich in ApplComm.c an und betrachte mir die beiden Variablen 
ApplComm_Debug1 und 2, so sehe ich deren Inhalt. Steppe ich weiter in 
BiosRs232.c und betrachte mir dort die gleichen Variablen, so sehe ich 
bei ApplComm_Debug1: optimized away|Error, wobei ApplComm_Debug2 (das ja 
hier gar nicht referenziert wird) komischerweise korrekt im 
Überwachenfenster angezeigt wird. Aktiviere ich den Code, der auch auf 
ApplComm_Debug2 in BiosRs232.c zugreifen will, dann sind beide Variablen 
"optimized away"...

Übrigens, der Code arbeitet vollkommen korrekt - die Variablen zählen 
richtig.

Kann man AtmelStudio so verstellen, dass die Anzeige der Variablen nur 
unter bestimmten Bedingungen möglich ist (nämlich nur in Datei 
ApplComm.c und nicht in BiosRs232.c)?

Zur Kontrolle habe ich ein von Grund auf neues Projekt erstellt und nur 
die obigen Sourcedateien eingehängt. Gleiches Verhalten.

Bin etwas ratlos, danke.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Atmel Studio ist dafür bekannt, nicht alle Debug-Infos auszuwerten. 
Nimm z.B. eine lokale Variable, die nie verwendet und wegoptimiert wird. 
In DWARF-2 und höher ward die Variable geführt.  Aber wenn der Debugger 
sich nicht dafür interessiert...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Um Verwirrung duch GNU-Erweiterungen zu vermeiden kann -gstrict-dwarf 
helfen, scheint hier aber nicht der Fall zu sein.

von Dieter (Gast)


Lesenswert?

> Nimm z.B. eine lokale Variable, die nie verwendet und wegoptimiert wird.
Naja, das trifft hier ja nicht ganz zu. Ich kann mir keinen trivialeren 
Fall mehr vorstellen als eine externe uint32_t-Variable. Wenn mein 
Beispiel nicht funktioniert, dann kann das Debuggen/Anzeigen von 
Variablen grundsätzlich nicht funktionieren. Das will ich nicht ganz 
glauben, sonst wäre das schon tausendfach aufgefallen, also muss da noch 
irgendwo ein Fehler stecken...
Aber wo?

von Dieter (Gast)


Lesenswert?

Hallo zusammen,

das Problem hat sich nach einem Update auf AtmelStudio 6.1SP2 von selbst 
gelöst. Jetzt funktioniert alles so wie erwartet. Sowohl in meinem 
Miniprojekt, als auch in meinem normalen Projekt lassen sich die 
Variableninhalte jetzt wie erwartet betrachten.

Hm. Naja, vielleicht hilft das ja doch irgendjemandem irgendwie in 
ähnlicher Situation weiter und bleibt mir zukünftig erspart. :-)

Vielen Dank jedenfalls für die Tipps oben.

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.