53 votes

la voie C++ allocations de mémoire

Je suis à la recherche d'un moyen de suivre les allocations de mémoire dans un programme C++. Je suis pas intéressé par les fuites de mémoire, qui semble être ce que la plupart des outils sont en essayant de trouver, mais plutôt la création d'une mémoire de profil d'utilisation de l'application. Sortie idéale serait une grande liste de noms de fonction plus nombre maximal d'octets alloués au fil du temps ou, mieux encore, une représentation graphique de la masse au cours du temps. L'axe Horizontal représente le temps, l'axe vertical de la mémoire. Chaque fonction serait d'obtenir sa propre couleur et de tracer des lignes selon alloué tas d'octets. Les points de Bonus pour l'identification attribué types d'objets.

L'idée est de trouver des goulets d'étranglement de mémoire/de visualiser quelles sont les fonctions/threads utilisent le plus de mémoire et doit être ciblé pour la poursuite de l'optimisation.

J'ai brièvement regardé Purifier, BoundsChecker et AQTime mais ils ne semblent pas être ce que je suis après. Valgrind semble approprié, cependant, je suis sur Windows. Memtrack semble prometteur, mais nécessite d'importantes modifications au code source.

Mon google compétences doit avoir échoué à moi, car il ne semble pas être d'une rare demande? Toutes les informations nécessaires pour créer un outil comme ça devraient être facilement accessibles à partir du programme des symboles de débogage, plus d'exécution des appels d'API - pas?

21voto

Nitin Bhide Points 1342

Microsoft ont bien documentée de la mémoire des fonctions de suivi. Cependant, pour une raison quelconque, ils ne sont pas vraiment bien connu dans la communauté des développeurs. Ce sont des CRT fonctions de débogage. Bon point de départ sera le CRT de Débogage Tas de fonctions.

Consultez les liens suivants pour plus de détails

  1. Tas d'état fonctions de production de rapports
  2. Le suivi des tas de demandes d'allocation. C'est probablement la fonctionnalité que vous recherchez.

18voto

Skizz Points 30682

Pour une C++ générique mémoire tracker, vous aurez besoin de surcharger le texte suivant:

global operator new
global operator new []
global operator delete
global operator delete []
any class allocators
any in-place allocators

Le problème est d'obtenir de l'information utile, la surcharge d'opérateurs n'ont les informations de taille pour les allocateurs et de la mémoire de pointeurs pour les suppressions. Une solution consiste à utiliser des macros. Je sais. De méchant. Un exemple: les mettre dans un en-tête qui est inclus à partir de tous les fichiers sources:

#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define new new (__FILE__, __LINE__, __FUNCTION__)

et créer un fichier source avec:

void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}

Le ci-dessus ne fonctionne que si vous n'avez pas tout exploitant d'une nouvelle définition à la portée de classe. Si vous avez un à portée de classe, faire:

#define NEW new (__FILE__, __LINE__, __FUNCTION__)

et remplacer "nouveau type" par "NOUVEAU type", mais qui nécessite de changer beaucoup de code potentiellement.

Comme c'est une macro, le retrait de la mémoire tracker est assez simple, l'en-tête devient:

#if defined ENABLED_MEMORY_TRACKER
#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define NEW new (__FILE__, __LINE__, __FUNCTION__)
#else
#define NEW new
#endif

et la mise en œuvre de fichier:

#if defined ENABLED_MEMORY_TRACKER
void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}
endif

7voto

BuschnicK Points 1593

La surveillance de Votre PC, l'Utilisation de la Mémoire Pour le Développement de Jeu contient un presque parfait exemple de ce que je cherchais. Il a fallu du temps pour le remettre en marche mais l'auteur de l'article a été très utile. Vous pouvez trouver le code source de l'outil ici Memtracer.

J'ai aussi eu beaucoup de réponses utiles sur la SWENG (Génie Logiciel de Liste de Diffusion). Le fil est appelé "[Sweng-Gamedev] suivi de C++ l'utilisation de la mémoire?".

1voto

Naveen Points 37095

Essayez celui-ci aussi: Mémoire Validateur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X