L'examen de C/C++ Tas de statistiques de la mémoire dans gdb

Je suis en train d'enquêter sur l'état de la C/C++ tas de dans gdb sur Linux amd64, est-il un bon moyen de faire cela?

Une approche que j'ai essayé est "d'appeler mallinfo ()", mais malheureusement, je ne peux pas extraire les valeurs que je veux depuis gdb ne s'occupe pas de la valeur de retour correctement.

Je ne suis pas capable d'écrire une fonction pour être compilé dans le binaire pour le processus je suis attachée, donc je ne peux tout simplement mettre en œuvre ma propre fonction pour extraire les valeurs en appelant mallinfo() dans mon code de cette façon. Est-il peut-être une astuce qui va me permettre de le faire à la volée?

Une autre option pourrait être de localiser le tas et traverse le malloc en-têtes /liste libre; je vous en serais reconnaissant les pointeurs vers où je pourrais trouver l'emplacement et la disposition de ces.

J'ai essayé de Google et de lire à travers le problème pendant environ 2 heures et j'ai appris quelques trucs fascinants, mais toujours pas trouvé ce dont j'ai besoin.

  • De quoi avez-vous besoin de connaître l'état? Quel type de données avez-vous besoin de savoir?
  • La taille de segment de mémoire, la quantité utilisée et la quantité libre est un bon début
  • Qu'est-ce que gdb ne pas le faire correctement?
  • Eh bien, je suis seulement en utilisant ma propre définition de l'correctement selon mes exigences, ce qui est d'être en mesure de référence de la structure renvoyée par "appel mallinfo()" et regarder les valeurs des membres qui y sont.
  • Malheureusement je pense que la situation est rendue plus complexe, car l'inférieur n'a pas inclus la fonction malloc.h et de "struct mallinfo" ne semble pas être dans la liste des types; peut-être que si c'était le cas alors gdb me permettrait d'interroger ses membres. Au lieu de cela je viens d'obtenir un entier de valeur de retour (peut-être parce que la définition de la fonction n'est pas inclus et il est défaillant à un retour int type); ce pourrait être un pointeur, mais je ne sais pas comment de référence (et non un pointeur en mémoire dans l'inférieur).