4

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 のポート数は減少しません。スレッドをクリーンアップするために他に必要なことはありますか?

4

1 に答える 1

2

Dtraceを使用して、実行中のシステムでの mach ポートの使用状況を計測できます。多くの mach_port 関連のプローブがあります。

sudo dtrace -l | grep mach_port

各ポートの作成または保持呼び出しが対応するリリースによってバランスが取れているかどうかを追跡する Dtrace スクリプトを作成できます。メモリ リークを追跡するための dtrace スクリプトは、出発点として役立ちます。

目的に合ったスクリプトを作成したら、Instruments を使用してトレース セッションを制御し、結果をグラフ化できます

于 2016-01-30T05:57:06.637 に答える