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.
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).
> 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.
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.ä..
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.
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...
Um Verwirrung duch GNU-Erweiterungen zu vermeiden kann -gstrict-dwarf helfen, scheint hier aber nicht der Fall zu sein.
> 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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.