13

私のアプリケーション(ベースアプリケーションはC ++ / CLIとのMFC相互運用ですが、多くのC#、Windowsフォーム、WPFも含まれています)にハンドルリークがあります。アプリケーションの開始直後に、タスクマネージャーのハンドル数が継続的に増加していることがわかります(1秒あたり10個の新しいハンドルの割合で)。そこで、handles.exeを使用して、ハンドルの種類を確認しました。リークしているハンドルがプロセスハンドルであることがわかりました。そして、それらは私のアプリケーションのプロセスへのプロセスハンドルです。

それで、私は通常、どの操作がそれが実行されるプロセスへのハンドルを作成するのだろうかと思います。何か考えはありますか?このようなものを見たことがありますか?デバッグDLLを使用できず、xcopyでデプロイできるツールしか使用できないことを考慮して、リークを追跡するために他に何ができるでしょうか。

アップデート:

windbg!handle、!htraceをスローすることができ、プロセスハンドルはすべて、次のスタックトレース(頻度順に)を使用して作成されていることがわかりました。

0x79f7570b: mscorwks!CorExitProcess+0x00022055
0x79f03edd: mscorwks!GetPrivateContextsPerfCounters+0x0000b6fe
0x79f04b87: mscorwks!GetPrivateContextsPerfCounters+0x0000c3a8
0x79f04b03: mscorwks!GetPrivateContextsPerfCounters+0x0000c324
0x79f919bf: mscorwks!CorExitProcess+0x0003e309
0x79f91b28: mscorwks!CorExitProcess+0x0003e472
0x792d6b4c: mscorlib_ni+0x00216b4c
0x1391a663: +0x1391a663
0x1391a0b1: +0x1391a0b1
0x7a9ea544: System_ni+0x005aa544
0x792a842f: mscorlib_ni+0x001e842f

また

0x7c8106f5: kernel32!CreateThread+0x0000001e
0x79f04bb2: mscorwks!GetPrivateContextsPerfCounters+0x0000c3d3
0x79f04b03: mscorwks!GetPrivateContextsPerfCounters+0x0000c324
0x79f919bf: mscorwks!CorExitProcess+0x0003e309
0x79f91b28: mscorwks!CorExitProcess+0x0003e472
0x792d6b4c: mscorlib_ni+0x00216b4c
0x1391a663: +0x1391a663
0x1391a0b1: +0x1391a0b1
0x7a9ea544: System_ni+0x005aa544
0x792a842f: mscorlib_ni+0x001e842f

また

0x08ec2eba: +0x08ec2eba
0x792b8277: mscorlib_ni+0x001f8277
0x792b8190: mscorlib_ni+0x001f8190
0x792b8040: mscorlib_ni+0x001f8040
0x792b7ff2: mscorlib_ni+0x001f7ff2
0x677e48f3: System_Runtime_Remoting_ni+0x000748f3
0x677e44be: System_Runtime_Remoting_ni+0x000744be
0x677e46ec: System_Runtime_Remoting_ni+0x000746ec
0x677e8408: System_Runtime_Remoting_ni+0x00078408
0x7926eb8d: mscorlib_ni+0x001aeb8d

さて、それは私に何を伝えますか?

4

3 に答える 3

1

相互運用機能を介して COM オブジェクトを呼び出す Web サービスにも同じ問題がありました。

作成した相互運用オブジェクトに対して Marshal.ReleaseComObject を明示的に呼び出すことで、これを解決しました。その瞬間以降、私にとって問題はありません。

それが役に立てば幸い。

于 2011-05-07T14:17:54.087 に答える
0

それで...パフォーマンスカウンターを明示的に行っていますか(そうであれば、それらを無効にしてリークの原因を絞り込んでみてください)。

于 2011-05-07T14:36:22.143 に答える