2011-07-27 1 views
2

Solarisでファイルリークと対応するスタックを検出する方法はありますか?私は情報がLinux上のvalgrindによってうまく報告されていることを知っています。 Solarisにもツールがあるかどうか教えてください。Solarisでファイルリークとそれに対応するコードを検出する方法は?

+2

ファイルリークとは何ですか? –

+0

ファイルリークは、ソケットまたはファイルディスクリプタを開いて閉じないシナリオです。同じコードが何度も呼び出され、ファイルが漏洩する可能性があります。 – yogishaj

+3

用語は**リソースリーク** –

答えて

2

Linuxでは、あなたは、すべてのファイルにオープン近いの呼び出しをログに記録するstraceを使用することができます。次に、リソースリークのログを分析することができます。の番号をにすると、の番号がと一致する必要があります。これが真実でない場合は、漏れがあります。 Solarisには同様のツール - DTraceがあります。

+2

'dtrace'は特に' strace'の近くにありません。実際、Solarisの_ straval_と 'strace'は' truss'です(同じことをする2つのコマンドラインオプションの多くまで)。 Linuxの 'dtrace'にインスパイアされた機能は、SystemTap、' stap'&friendsです。 –

+0

また、漏れに関するいくつかの有益な情報を得るためにいくつかの簿記を行う必要があります。リークされたファイル記述子が開かれたスタックトレース(または少なくともソースコードの場所)。もちろん、あなたは 'dup()'などもカバーする必要があります。したがって、straceまたはtrussは、スタックトレース/位置情報を取得できないため、十分ではありません。 – maxschlepzig

2

Solarisでは、単にpfilesコマンドを使用するだけで、現在開いているプロセスのファイル記述子を見ることができます。オープン/クローズされているファイルを追跡する場合は、ファイル関連のシステムコール用のフィルタ(truss -e open,closeがありますが、それにはファイル記述子を作成するものがあります)を使用する(Solarisの場合はstraceと同じです)があります。

pfiles出力が大きくなる場合は、まず漏洩しているファイルが通常のファイルか、ソケット/パイプなのかを特定します。通常のファイルが漏れている場合は、dtraceスクリプトを使用できます。以下は自分の実験のための基礎ですが、私は現在、それを試して改良するためにSolarisシステムを手にしていません。下記参照。

#!/usr/bin/dtrace -s 

syscall::open:entry { self->t = ustack(); } 
syscall::open:return /arg0 >= 0/ { trackedfds[arg0] = self->t; } 
syscall::open:return { self->t = 0; } 

syscall::close:entry { self->t = arg0; } 
syscall::close:return /arg0 >= 0/ { trackedfds[self->t] = 0; } 
syscall::close:return { self->t = 0; } 

END { printa(trackedfds); } 

これは、そのコンテンツopen()システムコール時にusersideのスタックトレースであるファイル記述子番号によって索引付け連想配列を構築します。クローズが成功すると、指定されたファイル記述子番号のエントリは破棄され、プログラムが終了すると(またはスクリプトが停止されている場合)、連想配列の残りの内容が出力されます - 残っていればリークの候補になります。

END {}プローブがこの場所に適切でない可能性があります。 proc::exitなどが必要な場合があります。これは、プログラムの終了時に終了したクリーンアップの前または後で(プログラムを終了/強制終了すると、すべてのファイル記述子が閉じられ、trackedfds[]配列が消去される)、いつトリガされるかによって異なります。だからこそ私はこれが出発点であると言ったが、Solarisシステムなしではチェックすることはできない。

+0

このスニペットには2つの問題があります:1)連想配列(集計とは異なります)はdtraceで印刷できません。ステートメントを印刷することでサポートされておらず、ループステートメントがないので反復できません。2)このように右側にutrace()は許されません。それは集計キーとして、そしてスタンドアローンとしては良いですが、式としてではありません。 – maxschlepzig

関連する問題