小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Process Explorerでハンドルリークを調査する方法

f:id:replication:20150613125054p:plain

はじめに

アプリケーションを長時間動作させた際にハンドル数が増加していく場合、ハンドルリークが発生している可能性が疑われます。

この記事では、Process Explorerを使ってハンドルリークを調査する方法をまとめました。

デバッグではじめるCプログラミング
山本 貴光
翔泳社
売り上げランキング: 214,813

必要なもの
  • 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ボタンを押下します。
f:id:replication:20150613125221p:plain
f:id:replication:20150613125233p:plain
このプログラムを動作させると、タスクマネージャ上でハンドル数が増加していくのが分かります。
f:id:replication:20150613125247p:plain

Process Explorerを使ってハンドルリークを調査する

1.Process Explorerを起動します。
2.View→Slect Columns...からProcess Performanceタブを選択し、「Handle Count」にチェックを入れます。これ一覧上ハンドル数が確認できます。
f:id:replication:20150613130721p:plainf:id:replication:20150613130723p:plain
3.View→Lower Pane View→Handlesを選択します。
f:id:replication:20150613130301p:plain
4.対象のアプリケーション(HandleLeakApp.exe)を起動します。
5.HandleLeakApp.exeを選択すると、画面下部にハンドルの一覧が表示されます。
f:id:replication:20150613130250p:plain

起動直後、HandleLeakApp.exeのハンドル数は13です。
f:id:replication:20150613131120p:plain
ハンドル数を監視すると、ハンドル数が徐々に増えていきます。また、画面下部のハンドル一覧を確認すると、C:\sample.txtへのハンドルが増えていくのが分かります。
f:id:replication:20150613131137p:plain

このように、Process Explorerを使うとハンドル数の増加や具体的に何のハンドルが増えているのかが分かります。

ちなみにProcess Explorerの画面でCtrl + Aでその時点の状態をテキストデータで保存できるたるため、実行前と実行中の2点間で差をとれば、どのハンドルが増えていくのかが分かると思います。