はじめに
アプリケーションを長時間動作させた際にハンドル数が増加していく場合、ハンドルリークが発生している可能性が疑われます。
この記事では、Process Explorerを使ってハンドルリークを調査する方法をまとめました。
必要なもの
- Process Explorer
以下のページからProcess Explorerを入手します。
ハンドルリークするサンプルプログラム(HandleLeakApp.exe)
以下のプログラムを実験に使います。fopenしてfcloseしていないのでファイルハンドルが徐々に増えていくはずです。
#include "stdafx.h" #include "windows.h" #include <stdlib.h> #pragma warning(disable : 4996) int _tmain(int argc, _TCHAR* argv[]) { system("pause"); FILE *fp; char *filename = "c:\\sample.txt"; int i = 0; while (i < 10000) { // ファイルのオープン if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "%sのオープンに失敗しました(%d)\n", filename, GetLastError()); return 1; } // handle leak! //fclose(fp); printf("%d", i); Sleep(500); // 500msスリープ i++; } return 0; }
タスクマネージャ上でハンドル数を確認する
タスクマネージャを起動し、プロセスタブを表示します。
表示(V)→列の選択(S)、ハンドルにチェックを入れてOKボタンを押下します。
このプログラムを動作させると、タスクマネージャ上でハンドル数が増加していくのが分かります。
Process Explorerを使ってハンドルリークを調査する
1.Process Explorerを起動します。
2.View→Slect Columns...からProcess Performanceタブを選択し、「Handle Count」にチェックを入れます。これ一覧上ハンドル数が確認できます。
3.View→Lower Pane View→Handlesを選択します。
4.対象のアプリケーション(HandleLeakApp.exe)を起動します。
5.HandleLeakApp.exeを選択すると、画面下部にハンドルの一覧が表示されます。
起動直後、HandleLeakApp.exeのハンドル数は13です。
ハンドル数を監視すると、ハンドル数が徐々に増えていきます。また、画面下部のハンドル一覧を確認すると、C:\sample.txtへのハンドルが増えていくのが分かります。
このように、Process Explorerを使うとハンドル数の増加や具体的に何のハンドルが増えているのかが分かります。
ちなみにProcess Explorerの画面でCtrl + Aでその時点の状態をテキストデータで保存できるたるため、実行前と実行中の2点間で差をとれば、どのハンドルが増えていくのかが分かると思います。