Forum: Compiler & IDEs arrays in funktionen finden C code


von jktotukgkg (Gast)


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.

von Peter D. (peda)


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.

von jktotukgkg (Gast)


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.

von PittyJ (Gast)


Lesenswert?

C++ vector<> benutzen. Damit kann man das Array auf die benötigte Größe 
verkleinern.

von Sebastian (Gast)


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

von Sebastian (Gast)


Lesenswert?

Sebastian schrieb:
> Die auf dem findest

Mist. Da fehlt "heap". Muss mich wohl doch mal anmelden, damit ich 
editieren kann :-)

von The D. (thedaz)


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.

von Peter D. (peda)


Lesenswert?

Man könnte den Stack mit einem Muster füllen, z.B. 0x77, dann die 
Funktion aufrufen und danach prüfen, wieviel von den 0x77 noch übrig 
sind.

von jktotukgkg (Gast)


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.

von Matthias H. (hallamen)


Lesenswert?

Im letzten Beispiel liegt die Variable buf am Stack, also genau dort wo 
sie hingehört. Wie bereits von Sebastian geschrieben kannst du dies mit
gcc -fstack-usage
ausfindig machen.

von jktotukgkg (Gast)


Lesenswert?

hi

habe jetzt mal alle .su durchgeschaut und noch einige große blöcke 
gefunden.
in den .su Dateien steht jedoch immer am ende "static"

Konnte jetzt den stack deutlich reduzieren.


danke

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.