Forum: Mikrocontroller und Digitale Elektronik Memory debuggen aber andersrum


von Mario H. (rocko)


Lesenswert?

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

von Robert W. (rweber)


Lesenswert?

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

von gast der gäste (Gast)


Lesenswert?

map file?

von Mario H. (rocko)


Lesenswert?

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

von Michael H. (mah)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ähnlicher Ansatz:

Building a user space library for dynamic memory analysis
http://www.embedded.com/design/opensource/218500483

von Vlad T. (vlad_tepesch)


Lesenswert?

naja dynamische Speicherverwaltung hat auf einem (so kleinen) 
Mikrokontroller nichts zu suchen

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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...

von Oliver (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.