mémoire C

Bonsoir à toutes et tous, existe-t-il un outil permettant d'analyser l'espace mémoire utilisé par les variable dans un programme en C ? L'analyse serait réprésentée sous la forme d'un graphique ou d'un tableau: telle variable int occupe tant d'octets, ou tel % de la taille totale de la mémoire, tel tableau de char tant d'octets, etc. En gros ça serait quelque chose qui automatise l'utilisation de la fonction sizeof sur toutes les variables du programme. Je sais pas si je m'explique bien :) Merci par avance, Pascal

Reply to
Pascal06
Loading thread data ...

Le 02-02-2023, Pascal06 snipped-for-privacy@toto.com a écrit :

Bonsoir,

Pas sûr que je comprenne la demande. Si c'est pour un code s'exécutant sur une machine standard, il faut voir les sections du binaires (.data par exemple, ou .text). Le code source ne donnera pas grand'chose parce que le compilateur peut optimiser des tas de choses (alignement mémoire entre autre, champs de bits...).

Si c'est pour de l'embarqué, il existe toujours un utilitaire avec le cross-compilateur qui permet de le savoir. Typiquement, quelque chose comme :

avr-size --format=avr --mcu=atmega1284 firmware.elf AVR Memory Usage

---------------- Device: atmega1284

Program: 122466 bytes (93.4% Full) (.text + .data + .bootloader)

Data: 6011 bytes (36.7% Full) (.data + .bss + .noinit)

EEPROM: 2311 bytes (56.4% Full) (.eeprom)

Sinon, pour les variables les unes après les autres, ça va être difficile puisqu'il y a en C des variables automatiques (sur la pile), des globales ou statiques et des variables sur le tas. Ça n'a donc pas beaucoup de sens.

JKB

Reply to
JKB

Et pourquoi ne pas aller poser la question dans le groupe C ?

Reply to
tTh

Le 02/02/2023 à 23:48, JKB a écrit :

Bonjour JKB, Merci pour ta réponse. Effectivement je me suis peut être mal exprimé. Je ne cherche pas à connaître la taille des variables dans le code compilé, mais plutôt je cherche à faire un récapitulatif des variables dans le code non compilé.

Par exemple:

void main (void){

unsigned char unevariable; unsigned char unevariable2[2];

// un code

}

void unefonction (void) {

int variablefonction; // un autre code

}

L'outil me donnerait un récapitulatif sous forme de fichier csv (par exemple):

fonction;variable;type;taille_octets; "void main (void)";"unevariable";"unsigned char";1; "void main (void)";"unevariable2[2];"unsigned char";2; "void unefonction (void)";variablefonction";"int";4;

On voit dans mon exemple simpliste que les tailles en octets seraient le résultats obtenus par sizeof(); notamment j'ai pris pour exemple le résultat de sizeof(int) qui dépend fortement du processeur cible :)

Pascal

Reply to
Pascal06

Le 03/02/2023 à 10:23, Pascal06 a écrit :

Bonjour à toutes et tous,

je reviens sur ce messages, car depuis j'ai trouvé des éléments de réponses. Il existe donc deux outils qui permettent d'analyser les fichiers map générés par le compilateur gcc:

formatting link
Malheureusement, ces outils ne fonctionnent pas avec le code que je voulais analyser et qui est compilé avec XC8 de Microchip: celui-ci n'étant pas basé sur GCC (contrairement à XC16). Par contre, dans le code assembleur qui est généré (fichier .lst), il est indiqué en commentaire la taille de chacune des variables utilisées, par exemple:

1642 ;; *************** function _main ***************** 1643 ;; Defined at: 1644 ;; line 112 in file "main.c" 1645 ;; Parameters: Size Location Type 1646 ;; None 1647 ;; Auto vars: Size Location Type 1648 ;; sgOld 4 63[BANK0 ] unsigned long 1649 ;; spOld 4 59[BANK0 ] unsigned long 1650 ;; sg 4 0 unsigned long 1651 ;; sp 4 0 unsigned long 1652 ;; drvConfig 2 67[BANK0 ] struct . 1653 ;; adcRawValue 2 0 unsigned short 1654 ;; msdiStatus 1 0 enum E3961 1655 ;; i 1 0 unsigned char 1656 ;; Return value: Size Location Type 1657 ;; 2 313[None ] int 1658 ;; Registers used: 1659 ;; wreg, fsr0l, fsr0h, fsr1l, fsr1h, status,2, status,0, pclath, cstack

Ce qui correspond donc tout à fait à ce que je cherchais. On voit par exemple que sgOld prend 4 octets, que c'est un unsigned long ( = uint32_t), qu'il utilise le bank0. Le micro 8 bits utilisé est une PIC16F15244 Ce fichier lst est placé dans le dossier /dist/default du projet.

Si ça peut aider d'autre personnes ;)

Pascal

Reply to
Pascal06

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.