Hallo Leute, Ich wandere anscheinend irgendwo im meinem Programm über ein Array hinaus und schreibe wo hin, wo ich eigentlich nicht hin schreiben sollte (das musste ja mal passieren!). Da ich weis welche Variable ich mir überschreibe, würde ich gerne wissen welche Variablen kurz VOR der entsprechenden Adresse im Speicher abgelegt sind um so einen groben Anhaltspunkt zu finden wo ich suchen muss. Gibts hier eine Möglichkeit? Im AVR Studio sehe ich vor der entsprechenden Adresse nur "00"en, damit kann ich keine Rückschlüsse ziehen wie die zugehörige Variable heisst. Da die meisten Arrayfunktionen in meinem Programm mit UART-Kommunikation zu tun hat, kann ich das auch nicht simulieren. (Initialisierung dauert in Realzeit schon 1-2 Sekunden!, dabei gibts Handshakes etc... über den UART). vielen Dank Rocko ps.: Atmega 2561+WINAVR, Simulation mit AVR Studio 4
Mario Hirth schrieb: > Da ich weis welche Variable ich mir überschreibe, würde ich gerne wissen > welche Variablen kurz VOR der entsprechenden Adresse im Speicher > abgelegt sind um so einen groben Anhaltspunkt zu finden wo ich suchen > muss. > Ich kenn mich zwar mit dem AVR nicht aus, aber vermutlich kann dir dein Linker eine Symboltabelle erstellen. Falls du gcc und konsorten verwendest, gibt es die Tools nm und objdump. Die sollten die von dir benotigeten Info ausgeben. Gruss, rweber
Hi Leute, Wow: map file, symboltable alles da... Ich hätte wohl mal die ganzen Files die beim Compilieren angelegt werden mal durchsehen sollen ;-) Da ist eine Variable namens "tempstring" ein sehr verdächtiger Nachbar! Vielen Dank für den Hinweis... lg Rocko
Du könntest auch eine memory debugging library verwenden und das Array mit malloc() allokieren solche libraries haben eine Funktion, die periodisch die Integrität der malloc() Strukturen (vor und hinter dem array) überprüft und abwirft, wenn da was daneben gegangen ist; ev kann man die Überprüfungsroutine auch aus einem Timer-Interrupt aufrufen. zB das da: http://dmalloc.com/ habe das nie auf einem embedded System verwendet, sollte aber gehen (famous last words :-) -Michael
Ähnlicher Ansatz: Building a user space library for dynamic memory analysis http://www.embedded.com/design/opensource/218500483
naja dynamische Speicherverwaltung hat auf einem (so kleinen) Mikrokontroller nichts zu suchen
Stimmt, mit der dynamischen Speicherverwaltung sind wir von der Originalfrage abgewichen. Andererseits: Ein Atmega2561 (8 kB RAM) wie beim OP oder Atmega128 (4 kB RAM) bei dem Embedded-Autor (http://code.google.com/p/uniboard/) ist ja nicht mehr soooo klein und wenn man an eine Nutzung von externem RAM (SD-RAM) denkt...
Im Simulator einen breakpoint bei Schreibzugriff auf die Speicherstelle setzen. Geht z.B. mit VMLAB. Oliver
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.