3

プログラムを長時間実行し、利用可能なハンドルの数を時々出力するテストを作成したいと考えています。WINAPI関数でこれを行うにはどうすればよいですか?

これは、ハンドル リークをデバッグする方法に関する優れた記事です http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx しかし、それはしませんでした」私の場合は適切です。テストでデバッガーを自動化する方法がわかりませんでした。

4

1 に答える 1

7

それはそれがどのように機能するかではありません。消費できるハンドルの数はクォータによって制限されており、デフォルトでは 10,000 ハンドルです。ハンドルには 3 つのタイプがあり、それぞれ独自のクォータによって管理されます。

  • カーネル ハンドル。kernel32.dll によってエクスポートされる関数によって返されます。ファイル、パイプ、ソケット、同期オブジェクトなど。それらを識別する最善の方法は、それらが解放される方法です。カーネル ハンドルには常に CloseHandle() が必要です。クォータを超えるカーネル ハンドルの数に厳密な上限はありません。カーネル メモリ プールのスペースが不足すると障害が発生します。

  • user32 ハンドル、ウィンドウ、およびメニュー オブジェクト。クォータを超えると、1 つのデスクトップ セッションで割り当てることができるハンドルの数に厳密な上限が存在します。同じデスクトップで実行されているすべてのプロセスのすべての user32 ハンドルの合計が上限を超えることはできません。65535 ハンドルであると考えられます

  • gdi ハンドル、デバイス コンテキスト、およびビットマップやブラシなどの描画オブジェクトなどです。クォータを超えると、user32 が処理するのと同じハード上限が適用されます。

3 つのクォータ制限のいずれかを消費すると、プログラムは常に失敗します。ただし、他のプロセスが多くの user32 または gdi オブジェクトを消費する場合、またはカーネル メモリ プールが圧迫されている場合は、早期に失敗する可能性があります。

賢明なことは、まだ利用可能なハンドルの数をログに記録することではありません。見つけることはできませんが、代わりに、消費したハンドルの数をログに記録します。GetGuiResources() を呼び出して、消費された user32 および gdi ハンドルの数を追跡できます。GetProcessHandleCount() は、プロセスで使用中のカーネル ハンドルの数を返します。

ただし、コードを記述する代わりに、最も簡単な方法は、タスク マネージャーの [プロセス] タブを使用することです。View + Select Columns を使用し、Windows 8 では列ヘッダーを右クリックし、Handles、User Objects、および GDI Objects にチェックマークを付けます。プログラムの実行中に 3 セットのハンドル タイプのハンドル カウントのライブ更新を取得し、コードのデバッグ中に即座にフィードバックを取得します。

于 2013-03-07T13:16:01.623 に答える