なぜWindowsコンソールアプリケーションリークがアイドリング時にしますか? (そして、なぜ?? kernel32.dllので喫煙ガンポイントを行います)
-
18-09-2019 - |
質問
私は毎分かそこら約4キロバイトのプライベートメモリをリークしているように見える窓のマルチthrededコンソールアプリケーションを持っています。
漏れが停止するまでのリークをローカライズするための努力で、私は徐々にアプリケーション内の各スレッドを停止している、と私の驚きに犯人が「Win32Thread」という名前のスレッドのようです。
これは私が明示的に開始しているスレッドのように見えません。
私は、添付したアプリケーションを破る場合は、、スタックトレースは次のようになります:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_NtCancelTimer@8() + 0xc bytes
ntdll.dll!_RtlpResetTimer@12() + 0x15 bytes
> ntdll.dll!_RtlpServiceTimer@12() + 0xfd bytes
ntdll.dll!_KiUserApcDispatcher@16() + 0x25 bytes
kernel32.dll!_BaseThreadStart@8() + 0x34 bytes
これは突然に漏れなぜ誰もが任意のアイデアを持っていますか?
WIN2K3 SP2のデュアルコアシステムで約40hrsのために実行されて、アプリケーションを。
すべてのアイデアはgreately評価されています。
解決
そのスタックトレースが見えます。私はあなたのコード(または使用ライブラリ)がtimeSetEvent
または同様の機能を使用して、タイマーを開始したことを推測すると思います。その場合には、リークはおそらくあなたのタイマーコールバック関数になります。
マルチメディアタイマーを起動すると、スレッドが作成されます、そして、あなたのコールバックがそのスレッドから呼び出されます。アイドリングしながら、それが漏れた理由周期タイマーを説明するだろう。
他のヒント
あなたのアプリケーションは、任意の抗原提示細胞(非同期プロシージャコール)またはスケジュールタイマーイベントを持っていますか? マルチメディアタイマーコールバックだろう。
あなたのコールバックはCランタイム・コールを使用している場合、これらの呼び出しは(_tcstol、sprintfのなど)自分の仕事をするために(遅延し、割り当てられた最初の時間は、関数がスレッドで呼び出された)一回限りのスレッドローカルな割り当てを行います。スレッドが(beginthreadで開始)またはbeginthreadex()されなかったため、スレッドが死ぬときに、このメモリをクリーンアップすることができないので、それはリークとして現れるだろう。