問題タブ [handle-leak]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - System.Threading.Timer から UI を呼び出すときにハンドルのリークを回避するにはどうすればよいですか?
System.Threading.Timer からのコールバックで winforms コントロールで Invoke を呼び出すと、タイマーが破棄されるまでハンドルがリークするようです。これを回避する方法を知っている人はいますか? 毎秒値をポーリングし、それに応じて UI を更新する必要があります。
テストプロジェクトで試してみて、それが実際にリークの原因であることを確認しました。これは単に次のとおりです。
Windows タスク マネージャーで監視すると、1 秒あたり 2 ハンドルがリークします。
.net - .NETSystem.Threading.Threadクラスでリークを処理する
アプリのハンドルの数が増え続けているという問題があります。私はデバッグを行い、これがいくつかのルーチンに使用されるSystem.Threading.Threadクラスによって引き起こされていることを認識しました。デバッグを簡素化するために、サンプルの.NETアプリケーションを作成しました。
ボタンをクリックするたびに、System.Threading.Threadクラスを使用してスレッドが作成されます。問題は、クリックするたびにハンドルの数が最大5増加するため、スレッドがハンドルを解放しないように見えることです。
問題は、System.Threading.Threadクラスによって作成されたすべてのハンドルを手動で解放するにはどうすればよいですか?
前もって感謝します。
c# - 奇妙なハンドルリーク
私のアプリケーション(ベースアプリケーションはC ++ / CLIとのMFC相互運用ですが、多くのC#、Windowsフォーム、WPFも含まれています)にハンドルリークがあります。アプリケーションの開始直後に、タスクマネージャーのハンドル数が継続的に増加していることがわかります(1秒あたり10個の新しいハンドルの割合で)。そこで、handles.exeを使用して、ハンドルの種類を確認しました。リークしているハンドルがプロセスハンドルであることがわかりました。そして、それらは私のアプリケーションのプロセスへのプロセスハンドルです。
それで、私は通常、どの操作がそれが実行されるプロセスへのハンドルを作成するのだろうかと思います。何か考えはありますか?このようなものを見たことがありますか?デバッグDLLを使用できず、xcopyでデプロイできるツールしか使用できないことを考慮して、リークを追跡するために他に何ができるでしょうか。
アップデート:
windbgと!handle、!htraceをスローすることができ、プロセスハンドルはすべて、次のスタックトレース(頻度順に)を使用して作成されていることがわかりました。
また
また
さて、それは私に何を伝えますか?
windbg - !htraceはコールスタックを表示しません
WinDbgで!htrace -diffを使用してハンドルリークをデバッグすると、コールスタックを表示しない多くのハンドル(おそらくリークしているハンドル)が表示されます。
これの理由は何であり、これをさらにデバッグするためにどのようなオプションが必要ですか?
更新:ハンドルリークは、グラフィックドライバまたはグラフィックカードに依存しているようです。何らかの形式のWPFを使用すると、リークが発生し始めます。これは、特定のグラフィックカード/ドライバーを搭載した一部のWindowsXPシステムでのみリークします。
c# - AdsConnectionが閉じられていませんか?
次のコードを検討してください。
すべての顧客がAdavatageDBサーバーを持っているわけではなく、OleDbConnectionにフォールバックする必要があるため、この方法は一般的です。ただし、ほとんどの場合、AdsConnectionオブジェクト(Advantage.Data.Provider.dllから)を使用します。
上記のコードは接続を閉じ、usingステートメントを終了するとオブジェクトが破棄されます。
Advantage Management Utilityを使用してAdsサーバー上のすべての接続を表示すると、接続が開いたままになっていることがわかります。すべてではありません!メソッドをおそらく200回呼び出しますが、開いたままになるのはごくわずかで、クライアントのMAX_CONNECTIONSを超えることもあります。JensMühlenhoffのおかげで、それを回避することができます。
質問は:
oConn.Close()を呼び出すときに接続が閉じないのはなぜですか?誰かアイデアはありますか?
c# - WinDbgでC#スタックトレースを表示する際の問題
C#プログラムでハンドルリークが発生しました。おおまかにこの回答に示されているように、!htraceを使用してWinDbgを使用して診断しようとしていますが、WinDbgで!htrace -diffを実行すると、C#関数の名前が表示されないスタックトレースが表示されます(または私の.netアセンブリでさえ)。
私は自分の難しさを説明するために小さなテストプログラムを作成しました。このプログラムは、「リーク」ハンドル以外は何もしません。
アセンブリをコンパイルしてから、WinDbgで[ファイル]-> [実行可能ファイルを開く]に移動し、プログラム(D:\ Projects \ Sandpit \ bin \ Debug \ Sandpit.exe)を選択します。プログラムの実行を続行して中断し、「!htrace -enable」を実行してから、もう少し長く続けてから、中断して「!htrace-diff」を実行します。これは私が得るものです:
ご覧のとおり、スタックトレースには、C#関数名「Main」と「Fun1」がありません。「System_ni+0x ...」フレームが私の関数フレームかもしれないと思いますが、わかりません。私の質問は、WinDbgでC#関数の関数名をスタックトレースに表示するにはどうすればよいですか?
追加情報:私のWinDbgシンボル検索パスは
SRV C:/ symbol http://msdl.microsoft.com/download/symbols ; D: \ Projects \ Sandpit \ bin \ Debug; srv *
WinDbgで実行可能ファイルを開いても、エラーは発生しません。出力ディレクトリ(「D:\ Projects \ Sandpit \ bin \ Debug」)に「Sandpit.pdb」というファイルがあります。プロジェクトはローカルでビルドされるため、pdbファイルはexeと一致する必要があります。ここからWinDbgをダウンロードしました。VisualStudioのプロジェクト設定で[ネイティブコードのデバッグを有効にする]をオンにしました。
c# - .Net 2.0 Windows アプリケーションでのリークの処理
アプリケーションでリークを処理する必要があります。
アプリケーションでいくつかのビューアをテストして、約 200 回の開閉を行ったところ、ハンドル数が約 200 であることがわかりました。
同じビューアの場合、メモリ使用量は一定であり、GDI カウントも一定です。
問題は、ハンドルが毎回増加していることですが、一定ではありません。5 ずつ増加する場合もあれば、1 ずつ増加する場合もあれば、減少する場合もあります。GDI リークのように一定の増加は見られませんでした。
アプリケーションに登録されているすべてのイベントのサブスクライブを既に解除し、アプリケーションで使用されているすべてのコントロールも破棄しました。以前は、アプリケーションにもメモリ リークがありました。すべてのコントロールを破棄した後も、一定のままです。
では、この場合に確認する必要がある他のすべてのことは何ですか。メモリ/GDI カウントは一定ですが、ハンドルは増加するだけなので、少し混乱します。
任意の提案をいただければ幸いです。
c# - C# アプリでハンドル リークを検出する方法
私のC#アプリでは、実行すると、ハンドル列の数が着実に増加していることがWindowsタスクマネージャーではっきりとわかります。メモリは問題なく増加しません。ハンドルだけが非常に高いレベルに到達します。
このリークをデバッグして検出し、ハンドル リークを解決するにはどうすればよいですか。
ありがとう!