2016-01-30 1 views
3

J'ai un serveur écrit en C++ qui fuit les ports Mach lorsqu'il est exécuté sur osx. Plus précisément, lors de l'exécution top j'ai remarqué qu'il avait environ 50000 (sous #PORTS). Curieusement, je l'ai laissé pendant la nuit et le lendemain, la machine était pratiquement morte (il a fallu 15 minutes pour répondre à ctrl-c, n'acceptait pas de nouvelles connexions ssh), donc il a dû redémarrer. Une telle fuite pourrait-elle faire tomber le système comme ça? Il ne fonctionnait pas en tant que root.Comment dois-je procéder pour déboguer une fuite de port Mach?

Quoi qu'il en soit, quelles sont les bonnes stratégies pour rechercher la cause de ce type de fuite? Y a-t-il de bons outils?

J'ai trouvé un test qui, lorsqu'il est exécuté de manière fiable, fuit 5 ports, mais c'est à peu près tout.

Editer: J'ai trouvé que notre classe de thread crée une fuite de port mach, mais je ne comprends pas pourquoi. Dans le constructeur, nous avons le code suivant:

// Initialize the default attributes. 
if (0 != pthread_attr_init(&m_threadAttributes)) 
{ 
    throw "blah"; 
} 

// Set the thread to be joinable. 
if (0 != pthread_attr_setdetachstate(&m_threadAttributes, PTHREAD_CREATE_JOINABLE)) 
{ 
    pthread_attr_destroy(&m_threadAttributes); 
    throw "blah"; 
} 

if (0 != pthread_create(
      &m_thread, 
      &m_threadAttributes, 
      &StartThreadFunction, 
      reinterpret_cast<void*>(this))) 
{ 
    throw "blah"; 
} 

Et je remarque le port compte pour le processus se poursuit par l'un après l'appel à pthread_create, qui est prévu.

Puis, plus tard je me joins le fil avec le code suivant:

if (0 != pthread_join(m_thread, NULL)) 
{ 
    throw "blah"; 
} 

Et pas exception est levée, donc je ne peux supposer pthread_join retourné 0 et donc réussi, mais le nombre de ports en haut doesn ne baisse pas. Y a-t-il autre chose que je dois faire pour nettoyer un fil?

Répondre

2

Vous pouvez utiliser Dtrace pour mesurer l'utilisation du port mach sur un système en cours d'exécution. Il y a un certain nombre de sondes liées à mach_port:

sudo dtrace -l | grep mach_port

Vous pouvez écrire un script DTrace qui suit wether chaque création de chaque port ou conserver appel est compensé par une réduction correspondante. Les scripts Dtrace pour le suivi des fuites de mémoire seraient un bon point de départ.

Une fois que vous avez un script qui fonctionne pour vos objectifs you can use Instruments to control the trace session and graph the results.

+0

Ouais j'ai essayé dtrace plus tôt, et ça va probablement être une source d'accès root à la machine ... – Bwmat