4

WinDbg を使用して、ハンドルの割り当てにつながるコールスタックを知ることができるかどうか疑問に思っています。

例えば:

#include <windows.h>
#include <conio.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Press ENTER to leak handles." << endl;

    _getch();

    cout << "Leaking handles" << endl;

    for (int i = 0; i < 100; ++i)
    {
        HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (h != NULL)
        {
            cout << ".";
        }
    }

    cout << "Handles leaked. Press ENTER to exit." << endl;

    _getch();

    return 0;
}

このサンプルをビルドして WinDbg で起動すると、次の行の上のサンプルで、ハンドルを割り当てたコールスタックを取得できます。

HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);

コマンドをいじっています!handleが、これまでのところ進歩はありません。

これは、リーク分析を処理するのに適しています。私は認識し!htrace -enable!htrace -diffいますが、これは別の使用シナリオです (何らかの方法で組み合わせる方法や他の使用ベクトルがない限り、情報を提供してください)。

4

1 に答える 1

5

解決策と思われるものを見つけました:

  1. を使用してトレースを有効にする!htrace -enable
  2. プログラムを実行し、ハンドルリークを待ちます
  3. プログラムのハンドルを確認し、分析のためにピークのハンドルを使用して!htrace <handle>
0:001>!htrace -enable
トレースの処理が有効になっています。
正常に取得されたトレース情報スナップショットを処理します。
0:001> g
0:001>!handle
..。

ハンドル7d8
  タイプイベント
..。
111ハンドル
タイプカウント
イベント103
ファイル3
ポート1
ディレクトリ2
WindowStation 1
KeyedEvent 1
0:001>!htrace 7d8
--------------------------------------
ハンドル=0x000007d8-OPEN
スレッドID=0x00000fc4、プロセスID = 0x000017a8

0x0040106d:TestMemHandleLeak!wmain + 0x0000006d
0x0040151b:TestMemHandleLeak!__ tmainCRTStartup + 0x0000010f
0x7c817077:kernel32!BaseProcessStart + 0x00000023

--------------------------------------
解析された0x64スタックトレース。
ダンプされた0x1スタックトレース。

そして、そのアドレスでコード行を取得するために、次のことを行いました。

0:001> ln TestMemHandleLeak!wmain + 0x0000006d
f:\ temp \ windowsapplication3 \ testmemhandleleak \ testmemhandleleak.cpp(22)
于 2009-08-19T16:08:32.500 に答える