3

次のサンプル コードは、ハンドルをリークします。ハンドル数は 133 から始まり、2 時間以内に 900 に達しました。サンプルは VS2010 と .Net 4.0 です。これは .Net 3.5 では発生しません。すべての Win2008 R2 サーバーで、3 台以上のマシンでこれを再現しました。SQL 2008 と SQL 2012 の両方。これらのマシンは VM であり、週に 2 回常にロールバックされるため、クリーンです。

//Reference dll are the ones required for SQL 
//.Net 4.0 (not 'Client Profile' version)
static void Main(string[] args)
{

    string sss = "Data Source=WIN-0BDHQ0IIUFL,1433;Initial Catalog=DB_Mycentral;Persist Security Info=False;User ID=Myuser;Password=123;Connect Timeout=60;Network Library=dbmssocn";
    System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(sss);
    int i = 0;
    while (true)
    {
        i++;

        Thread.Sleep(1000 * 60 * 60);
        Console.WriteLine("{0} hrs sleep", i);
    }
}

ProcMon.exe のアクティビティと ProcExp.exe のコール スタックを観察しました。ProcMon.exe は、CreateThread() と ExitThread()を繰り返し記録しました。その後、ProcExp.exe は 、新しく作成された TID に対してcld.dll!StrongNameErrorInfo+0 ​​x18910 を示しました。最後に、ProcExp.exe の THREAD オブジェクト数が 1 つ増えました。このプロセス全体が何度も繰り返されます。

Example for leaking of TID 9089:
CreateThread()/ExitThread() TID:9089 //Log in ProcMon.exe
cld.dll!StrongNameErrorInfo+0x18910  TID: 9089  //Call-stack in ProcExp.exe

背景: このサンプルは、本番コードのリークを絞り込むために作成しました。そのコードは .Net 3.5 では問題なく動作しましたが、.Net 4.0 ではリークします。

接続を開くときに追加のフラグを設定する必要がある場合はお知らせください。

4

1 に答える 1