LoginSignup
1
0

More than 1 year has passed since last update.

メモリリーク/ハンドルリークの調査

Posted at

Windows / VisualStudio での、メモリリーク / ハンドルリークの調査方法についてのメモです。

手順概要

  1. VisualStudioの診断ツールから、プロセスメモリが増え続けていないかをチェック
  2. _CrtSetDbgFlagを使用してメモリリークのチェック
  3. タスクマネージャから、ハンドル数が増え続けていないかをチェック
  4. ProcessExplorerから、ハンドルの中身をチェック
  5. windbgから、リークしたハンドルのスタックをチェック
  6. 各種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/

確保済みの全リソースを表示して、開放し忘れているテクスチャなどがあれば修正を行う。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0