web-dev-qa-db-fra.com

Examen des statistiques de la mémoire C / C ++ Heap dans gdb

J'essaie d'enquêter sur l'état du tas C/C++ à partir de gdb sur Linux AMD64, existe-t-il une bonne façon de le faire?

Une approche que j'ai essayée consiste à "appeler mallinfo ()" mais malheureusement je ne peux pas extraire les valeurs que je veux car gdb ne traite pas correctement la valeur de retour.

Je ne peux pas facilement écrire une fonction à compiler dans le binaire pour le processus auquel je suis attaché, donc je peux simplement implémenter ma propre fonction pour extraire les valeurs en appelant mallinfo () dans mon propre code de cette façon. Y a-t-il peut-être une astuce astucieuse qui me permettra de le faire à la volée?

Une autre option pourrait être de localiser le tas et de parcourir les en-têtes malloc/liste libre; J'apprécierais tous les pointeurs par où je pourrais commencer à trouver l'emplacement et la disposition de ceux-ci.

J'essaie de lire sur Google et de contourner le problème depuis environ 2 heures et j'ai appris des choses fascinantes mais je n'ai toujours pas trouvé ce dont j'avais besoin.

28
Mike Tunnicliffe

@fd - le bogue RedHat avait votre réponse.

La fonction mallinfo a été déconseillée et ne sera pas mise à jour. Une véritable API de statistiques de requête est TDB. Aujourd'hui, vous avez malloc_stats et malloc_info. Je ne trouve aucune documentation sur l'un ou l'autre, mais voici ce qu'ils vous donnent.

Est-ce assez proche de ce dont vous avez besoin?

(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =         96
Total (incl. mmap):
system bytes     =     135168
in use bytes     =         96
max mmap regions =          0
max mmap bytes   =          0

(gdb) call malloc_info(0, stdout)
<malloc version="1">
<heap nr="0">
<sizes>
<unsorted from="1228788" to="1229476" total="3917678" count="3221220448"/>
</sizes>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168"/>
<system type="max" size="135168"/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</heap>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168
/>
<system type="max" size="135168
/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</malloc>
27
leedm777

Si vous pouvez changer le code:

#include <malloc.h>
#include <stdio.h>

void dumpMallinfo(void) {
  struct mallinfo m = mallinfo();
  printf("uordblks = %d\nfordblks = %d\n", m.uordblks, m.fordblks);
}

Dans GDB, vous pouvez call dumpMallinfo().

3
leedm777