Windows / VisualStudio での、メモリリーク / ハンドルリークの調査方法についてのメモです。
手順概要
- VisualStudioの診断ツールから、プロセスメモリが増え続けていないかをチェック
- _CrtSetDbgFlagを使用してメモリリークのチェック
- タスクマネージャから、ハンドル数が増え続けていないかをチェック
- ProcessExplorerから、ハンドルの中身をチェック
- windbgから、リークしたハンドルのスタックをチェック
- 各種GPU用のデバッガから、グラフィックリソースのリークをチェック
手順詳細
1. VisualStudioの診断ツールから、プロセスメモリが増え続けていないかをチェック
VisualStudioから実行中に表示される診断ツールを確認して、プロセスメモリが増え続けている場合はなんらかのリークがあるので、調査を行う必要がある。
2. _CrtSetDbgFlagを使用してメモリリークのチェック
_CrtSetDbgFlagを使用することでメモリリークのチェックを行うことができる。
https://docs.microsoft.com/ja-jp/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2022
これはメモリリークが疑われない場合でも、常に書いておくと予防になるのでよい。
3. タスクマネージャから、ハンドル数が増え続けていないかをチェック
_CrtSetDbgFlagではハンドルリークのチェックはできない。
_CrtSetDbgFlagに引っかからないのに、プロセスメモリが増え続けている場合は、ハンドルリークを起こしている可能性がある。
まずはタスクマネージャからハンドル数を確認して、増え続けていないかどうかをチェックする。
4. ProcessExplorerから、ハンドルの中身をチェック
ハンドル数が増えていることが確認出来たら、そのハンドルの中身を確認する。
ProcessExplorer等から、ハンドルの中身を確認することができる。
https://replication.hatenablog.com/entry/2015/06/16/093000
(タスクマネージャのリソースモニターからも確認できるが、情報が少ないかもしれない)
ここでリークしたハンドルの中身が分かったのであれば修正を行う。
5. windbgから、リークしたハンドルのスタックをチェック
手順4でハンドルの中身が確認できればよいが、できない場合もある。
その場合はwindbgを使用することで、リークしているハンドルのスタック情報を得ることができる。
https://www.keicode.com/iis/iis504a.php
windbgはWindows Driver Kitからダウンロードできる
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugger-download-tools
ここでリークしたハンドルに目星がついたのならば、修正を行う。
6. 各種GPU用のデバッガから、グラフィックリソースのリークをチェック
手順5で例えばnvidia系のスタックが現れた場合などはグラフィックリソースがリークしている。
グラフィックリソースの確認は、各種GPU用のデバッガーを用いることで可能である。
https://www.khronos.org/opengl/wiki/Debugging_Tools
NVIDIA系の場合は、NVIDIA Nsight Graphicsを使用することで確認ができる。
https://blog.techlab-xe.net/check-nvidia-nsight-graphics/
確保済みの全リソースを表示して、開放し忘れているテクスチャなどがあれば修正を行う。