C++ で記述されたサーバーがあり、osx で実行すると Mach ポートがリークします。具体的には、実行top
中に約 50000 (under) であることに気付きました#PORTS
。不思議なことに、一晩実行したままにしておくと、翌日にはマシンが基本的に停止していたため (ctrl-c に応答するのに 15 分かかり、新しい ssh 接続を受け入れていませんでした)、IT 部門はマシンを再起動する必要がありました。このようなリークにより、システムがこのようにダウンする可能性はありますか? ルートとして実行されていませんでした。
とにかく、この種のリークの原因を検索するための良い戦略は何ですか? 何か良いツールはありますか?
実行時に確実に 5 つのポートがリークする 1 つのテストを見つけましたが、それだけです。
編集:私たちのスレッド クラスがマッハ ポート リークを作成していることがわかりましたが、その理由がわかりません。コンストラクターには、次のコードがあります。
// 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";
}
そして、プロセスのポート数が への呼び出し後に 1 つ増えることに気付きましたpthread_create
。これは予想どおりです。
次に、後で次のコードでスレッドに参加します。
if (0 != pthread_join(m_thread, NULL))
{
throw "blah";
}
pthread_join
また、例外はスローされないため、0 が返されて成功したとしか想定できませんが、top のポート数は減少しません。スレッドをクリーンアップするために他に必要なことはありますか?