9
votes

C - Vérifiez actuellement la RAM gratuite?

Je sais comment utiliser MALLOC () et gratuit () Pour allouer la mémoire, mais existe-t-il également une fonction C standard pour vérifier la quantité de mémoire gauche, donc Je peux appeler cela périodiquement pour vous assurer que mon code n'a pas de fuites de mémoire?

La seule chose que je peux penser est appelant malloc (1) dans une boucle sans fin jusqu'à ce qu'il renvoie une erreur, mais il ne faut pas y avoir de manière plus efficace?


8 commentaires

Pourquoi ne pas simplement utiliser Valgrind sur votre programme pour vérifier les fuites?


Notez que Calling MALLOC dans une boucle sans fin risque de ne jamais échouer car la plupart des systèmes n'allouent que la mémoire sur première touche .


Related: Stackoverflow.com/Questtions/2513505/ ...


@Ben: Tous les MALLOC L'appel se réserve une partie de l'espace d'adresses virtuel, de sorte que cela rendra éventuellement une erreur.


@Mike vois mon commentaire à Adam


@Larsmans, True, En fait, MALLOC a également besoin de la mémoire (physique) pour garder une trace des blocs alloués (même si vous laissez tomber les pointeurs). Donc, vous ne pouvez pas malloc pour toujours. Cependant, cela n'aide pas du tout à savoir combien de mémoire est laissée.


Vous pouvez trouver l'adresse en RAM avant de vouloir être détectée. Pour ce faire une valeur spécifique et continuer à le regarder dans Main () pour voir si elle est corrompue


Il n'y a pas de manière standard. Mais votre bibliothèque OS / Compiler / C peut avoir des fonctions supplémentaires pouvant vous donner les informations souhaitées. Afficher que cette information serait utile.


5 Réponses :


7
votes

Non, il n'y a pas de fonction C standard c pour le faire. Il existe certaines fonctions spécifiques à la plate-forme que vous pouvez utiliser pour effectuer certains types de requêtes (comme la taille du jeu de travail), mais celles-ci ne seront probablement pas utiles, car parfois la mémoire qui a été correctement gratuit () D est toujours considéré comme alloué par le système d'exploitation car la mise en œuvre MALLOC pourrait garder la mémoire libérée autour d'une piscine.

Si vous souhaitez rechercher des fuites de mémoire, je vous recommande vivement d'utiliser un outil tel que Valgrind , qui exécute votre programme dans une machine virtuelle de Tremples et peut suivre des fuites de mémoire, entre autres caractéristiques.

Si vous exécutez sous Windows, vous pouvez utiliser _crtdbgreport et / ou _crtsetdbggflag pour vérifier les fuites de mémoire.


2 commentaires

Le programme est le microprogramme exécuté sur un processeur Cortex M0 et utilise beaucoup d'appels / instructions spécifiques à bras, alors je pense qu'il serait difficile d'analyser pour Valgrind, et j'ai à peine suffisamment de mémoire sur l'appareil pour exécuter mon propre code, laisser seul pour ajouter une machine virtuelle.


Dans ce cas, mesurez la quantité de mémoire que vous avez au début de l'exécution et écrivez des fonctions Wrapper autour de MALLOC et gratuit pour décrémenter et incrémenter de votre point de départ, car loreb suggère dans une autre réponse.



2
votes

Si vous pouvez vous permettre # ifdef'ing une version de débogage (éventuellement dans un émulateur!), vous pouvez simplement créer une version de débogage de MALLOC / GRATUITE qui conserve le nombre d'octets actuellement en cours d'utilisation et "Imprimer" périodiquement (à nouveau - uniquement dans la version de débogage, éventuellement sous un émulateur) sur le périphérique de sortie que vous avez pour débogage (une LED?), et voir si elle continue d'augmenter.

Le truc standard consiste à allouer de la taille de (Taille_T) plus que demandé, stockant ainsi la taille avec la mémoire nouvellement attribuée - mais si vous écrivez un micrologiciel, je suppose que vous le savez déjà :)

Alors ... Avez-vous un émulateur?

Edit: Je suis tellement habitué aux ordinateurs courants à GHz que cela ne m'a pas eu au début, mais bien sûr une autre chose que vous puissiez faire est de compter le nombre d'allocations, pas de leur taille - je peux 't Imaginez comment cela pourrait prendre trop de mémoire pour courir.


0 commentaires

3
votes

Si dans votre système MALLOC () CODE> alloue toujours la mémoire physique, vous pouvez appeler MALLOC () code> à plusieurs reprises avec des tailles différentes de 1, mais par des pouvoirs successifs de deux. Ce sera plus efficace. Ci-dessous est un exemple de la façon de le faire.

Si, d'autre part, malloc () code> n'allocie que l'espace d'adressage virtuel sans mapper la mémoire physique, cela ne vous donnera pas ce que vous Vous voulez. p>

échantillon code: p> xxx pré>

sortie ( IDEONE ): P>

Total free: 266677120
Total free: 266673024
Total free: 266673024
Total free: 266673024
Total free: 266673024


2 commentaires

Cela ne tient pas compte des octets supplémentaires alloués par certaines implémentations pour chaque tampon Malloc'ed (à des fins d'alignement ou de validation de dépassements de tampon)


@Alfredd Malloc () ne vous laisserait pas les octets de toute façon.



0
votes

J'ai cherché et a trouvé cette question pour m'aider à faire une application pour animer de nombreuses itérations de fonctions fractales sur plusieurs tableaux de valeurs complexes.

Merci, Alexey Frunze, pour votre code IDONE.C. Il a certainement été utile.

bâtiment sur ce que j'ai appris, dans l'espoir de plus utile, j'ai écrit ce qui suit: xxx

utilisation:

blocs sans comptage [ block_size ]

entrée: xxx

sortie: xxx

i compréhensime ces fonctions dans ma propre application.


0 commentaires

4
votes

Linux glibc SYSCONF (_sc_avphys_pages) code> et get_avphys_pages () code> strong>

Ces deux extensions GLIBC doivent vous donner le nombre de pages disponibles. Nous pouvons alors simplement multiplier que par la taille des pages sysconf (_sc_pagesize) code> pour trouver la mémoire totale disponible. P>

main.c p> xxx pré>

Github en amont a >. p>

compiler et exécuter: p> xxx pré>

sortie de l'échantillon sur mon système de RAM 32GIB: p>

sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x6383FD000
get_phys_pages() * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
get_avphys_pages() * sysconf(_SC_PAGESIZE) = 0x6383FD000


0 commentaires