J'ai utilisé tcmalloc pendant quelques mois dans un grand projet, et jusqu'à présent, je dois dire que j'en suis assez content, surtout pour ses fonctionnalités HeapProfiling qui permettent de suivre les fuites de mémoire et de supprimer leur.Comportement inattendu de tcmalloc
Au cours des deux dernières semaines, cependant, nous avons rencontré des plantages aléatoires dans notre application, et nous n'avons pas pu trouver la source du crash aléatoire. Dans une situation très particulière, lorsque l'application s'est plantée, nous nous sommes retrouvés avec une pile complètement corrompue pour l'un des threads de l'application. Plusieurs fois, j'ai trouvé que les threads étaient bloqués dans tcmalloc :: PageHeap :: AllocLarge(), mais comme je n'ai pas de symboles de débogage de tcmalloc, je ne pouvais pas comprendre le problème.
Après presque une semaine d'enquête, aujourd'hui j'ai essayé la chose la plus simple: enlever tcmalloc du linkage pour éviter de l'utiliser, juste pour voir ce qui s'est passé. Eh bien ... J'ai finalement découvert quel était le problème, et le code incriminé ressemble beaucoup à ceci:
void AllocatingFunction()
{
Object object_on_stack;
ProcessObject(&object_on_stack);
}
void ProcessObject(Object* object)
{
...
// Do Whatever
...
delete object;
}
En utilisant l'application libc encore écrasé mais j'ai finalement vu que je l'appelais supprimer sur un objet qui était alloué sur la pile. Ce que je n'arrive toujours pas à comprendre, c'est pourquoi tcmalloc a gardé l'application en cours d'exécution malgré ce deallocation d'objet très risqué (sinon complètement faux) et la double désallocation quand object_on_stack est hors de portée quand AllocatingFunction se termine. Le fait est que le code incriminé pourrait être appelé à plusieurs reprises sans aucun indice de l'abomination sous-jacente.
Je sais que la désallocation de mémoire est un de ces "comportements non définis" lorsqu'elle n'est pas utilisée correctement, mais ma surprise est un comportement si différent entre la libc "standard" et tcmalloc.
Est-ce que quelqu'un a une sorte d'explication de la perspicacité, pourquoi tcmalloc maintient-il l'application?
Merci à l'avance :)
Have a Nice Day
Ils ont choisi leur "comportement indéfini" pour * ne pas planter *. Est-ce que je me fierais à cela? *Sûrement pas*. – WhozCraig