arrays in funktionen finden C code

Gast #4509075
Lesenswert?

hi

Ich habe momentan ein Problem mit fertigen libs.
In einigen Funktionen sind große Arrays/structs drin die zwar regulär 
auf den Stack/Heap geworfen werden aber mir dann an anderer Stelle 
Kopfweh bereiten.
Weil ich nie 100%ig weiß wieviel wirklich frei ist.

Gibt es tools die arrays in funktionen anzeigen / finden können?

Ich habe jetzt per hand angefangen zu suchen...
Das ist bei mehreren hundert Dateien jedoch extrem aufwändig.

Ich nutze einen  STM32F4 mit RTOS und mehreren Tasks.
Problem ist das ich künstlich den Stack aufblasen und zusätzlich ~10k 
Heap freilassen MUSS  damit es läuft.

Einige Größere Array/structs habe ich nun auf dynamisches 
Speichermanagement umgestellt was auch erfolg gebracht hat.
Als Dynamischen malloc bereich nutze ich die 64k CCM ..
hier ist auch noch recht viel Frei ~50-60%
Das würde mich nicht stören wenn dieser bereich zeitweise zugebombt 
wird.



Für Vorschläge bin ich dankbar.
#4509114
Lesenswert?

Ist doch egal, ob Du nun mehr RAM für den Stack oder für den Heap 
reservierst. Der maximal benötigte RAM ist genau derselbe.
Bzw. beim Stack ist es etwas weniger, da der Verwaltungsoverhead 
wegfällt.

Malloc bringt nur dann etwas, wenn die benötigte Größe zur Compilezeit 
unbekannt ist oder das Array über das Funktionsende hinaus benötigt 
wird.

Was allerdings sinnvoll ist, mal die großen Arrays auf die wirklich 
benötigte Größe abzuklopfen.
Oftmals verteilen Programmierer den RAM gedankenlos mit der Schöpfkelle, 
d.h. revervieren viel mehr, als nötig.
Gast #4509172
Lesenswert?

Hi danke schonmal


Ich habe teil unbekannte größen, teile bekannte.

Die kleinen bekannten größen bleiben auch so...
das betrifft meist funktionen mit berechnungen
( TLS Stack )

dazu habe ich noch andere buffer die  aktuell wirklich oversized sind
diese kann ich ja in DYN RAM umwandeln.


Mir geht es auch darum das ich noch etwas Speicher übrig habe.
Ich musste bisher immer die 10K reserve lassen.
Wenn ich das auf 2-3 k einstampfen kann ist das  für mich voll OK.

Damiot kann ich aber ggf noch weitere funktionen einbauen.
Gast #4509932
Lesenswert?

jktotukgkg schrieb:
> Gibt es tools die arrays in funktionen anzeigen / finden können?

Gibt es bestimmt. Zur Not mach dir selbst eins mit libclang oder als gcc 
plugin, wenn dir grep nach eckigen Klammern nicht reicht (weil es auch 
Arayzugriffe findet).

Aber würde es dir auch reichen, zu wissen wie viel Stack eine Funktion 
braucht? Die auf dem findest du dann mit grep malloc.
1
gcc -fstack-usage
#4510051
Lesenswert?

Das liefe darauf hinaus einen eigenen C / C++ parser zu schreiben und da 
kann ich dir aus eigener Erfahrung sagen: vergiss es. Man kann Array 
Typen auf so viele Arten in den beiden Sprachen schreiben und dann 
hinter Klassen und typedef verstecken, daß du mittels regulärer 
Ausdrücke niemals alle finden wirst. Dazu ist die C Typ Grammatik 
dermaßen verpfriemelt, daß du auch mit Lexx/Yacc graue Haare kriegen 
wirst. Die einzige Lösung ist wie oben beschrieben sich in den gcc 
Compiler einzuklinken und den AST an geeigneter Stelle auszuwerten. Oder 
eine Lösung anzustreben, die ohne dieses Wissen auskommt.
Gast #4512165
Lesenswert?

Vielen Dank

Stack habe ich nicht so das Problem.
RTOS hat ja statistic funktionen die mir dazu helfen.
Ich habe parallel zur eigentlichen Funktion eine HTTPS webseite mit den 
ausgaben der Tasks und deren Verbrauch.

Die TLS lib und eine andere lib brauchen aber in funktionen manchmal 
viel RAM.
1
void foo( ... ){
2
   char buf[4096];
3
// oder 
4
   structmit_daten data;
5

6
 // mach was mit buf ... oder data 
7
}
... das macht mir derbe kopfschmerzen.
Die konstrukte sind teils mehrere hundert bytes bis kbytes groß
die werden aber nicht in den stack gelegt... sondern auf den heap.
Der ist derzeit noch gut frei, ich würde aber gerne wissen wieviel.
auf 1-2kbytes kommt es mir nicht an.

aber wenn ich jetzt zB ein feature einbaue was viel RAM brauch,
kann es ja passieren das es kracht.


Ich will nun diese dicken bereiche( alles >64byte ) gegen dynamischen 
Speicher aus dem RTOS heap_4 austauschen.
Sie werden ja auch nur temporär benötigt.

Problematisch ist eben das auffinden dieser arrays/structs in den 
untiefen der libs.

Dachte da gibts evtl ne Anzeigemöglichkeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren