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?
Ouais j'ai essayé dtrace plus tôt, et ça va probablement être une source d'accès root à la machine ... – Bwmat