私は現在、マルチスレッドアプリケーションをデバッグしています。このアプリケーションは、一部の関数が約2000回呼び出されるまでエラーなしで実行されます。その後、アプリケーションは応答を停止します。これは、メモリ不足エラーで失敗した_beginthreadexまで追跡できます。
ProcessExplorerでアプリケーションを調べると、リークされたスレッドハンドルの数が増え、エラーが発生するまで仮想メモリが増えていることがわかります。プライベートバイトは低いままです。リークされたスレッドはCoInitializeも呼び出し、CoUninitializeを呼び出すことはありません。
私が知りたいのは:
- 仮想メモリは何を表していますか?
- 仮想メモリはリークされたスレッドハンドルに関連していますか?
- COMまたはMSXML6(スレッドによって呼び出される)はスレッドハンドルをコピーしますか?どのようにそれらを閉じることができますか?
私の質問が明確で、ルールを壊さないことを願っています。それは私の最初の質問であり、英語は私の最初の言語ではありません。:-(
言及するのを忘れました。スレッドが終了すると、_beginthreadexによって返されるハンドルを閉じます。これにより、開いているハンドルの数が約半分に減りますが、仮想メモリには影響しません。さらに、CloseHandle呼び出しを挿入する前に、ProcessExplorerに表示される各スレッドハンドルのスレッドのハンドル数は2でした。
編集
以前はこれを含めなかったのでバカになりました。VisualStudioでデバッグしているときにアクティブなスレッドの数が増えないため、スレッドが終了することを知っています。また、リークされたメモリのすべてが、かなり大きなライブラリで使用されているTerminateThreadの呼び出しの結果であるとは限らないことを願っています。また、それを変更したくないと思います。
私の質問のcom部分では、!htrace -diffを使用して、msxmlによって割り当てられたが、関数呼び出しの終了後に解放されなかったスレッドハンドルを見つけました。これらはリークに関連しているのでしょうか、それとも後で閉じられるのでしょうか。
それらすべてのコメントに感謝しますが、問題はまだそこにありますが、彼らは私がそれをよりよく理解するのを助けました。