LoginSignup
70
67

More than 5 years have passed since last update.

Visual Studio 2015のネイティブメモリ診断機能を使用してメモリリークを検出する

Posted at

Visual Studio 2015のネイティブメモリ診断機能を使用してメモリリークを検出する

Visual Studio 2015には「ネイティブメモリ診断」が新機能として搭載されています。

Visual Studio 2015 における Visual C++ の新機能

2.ネイティブ メモリ診断
a.メモリ診断セッション (Ctrl+Alt+F2)。ネイティブ アプリケーションのメモリ使用をデバッグ セッション中にリアルタイムで監視できます。
b.メモリのスナップショット。アプリケーションのヒープ内容の瞬間的なイメージをキャプチャします。 2 つのメモリ スナップショットを比較すると、ヒープの状態の違いを調べることができます。 アプリケーションを停止した後の各インスタンスのオブジェクト型、インスタンス値、および割り当て呼び出しスタックが表示されます。 各スナップショットの呼び出しツリーがスタック フレームごとに表示されます。

本機能を利用してアプリケーションのメモリリークを検出してみます。

調査環境

  • Windows 10Pro
  • Visual Studio Community 2015

調査対象プログラム

Win32Project1.cpp
#include "stdafx.h"
#include "Win32Project1.h"

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, 
                    _In_ LPWSTR    lpCmdLine, _In_ int       nCmdShow)
{
    while (MessageBox(NULL, TEXT("終了しますか?"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION) != IDYES)
    {
        char* ch = new char[256]; // メモリリーク!
    }

    return 0;
}

メモリリーク検出手順

1.調査対象プログラムのデバッグ実行
[デバッグ(D)]→[デバッグの開始]メニューを押下して調査対象プログラムをデバッグ実行します。
キャプチャ0.png

2.処理実行前のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次に[デバッグ(D)]→[診断ツールの表示]メニューを押下してネイティブメモリ診断ツールを表示させ、「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行前のスナップショットを作成します。
キャプチャ1.PNG

3.メモリリークを伴う処理の実行
[デバッグ(D)]→[続行(C)]メニューを押下してプログラムを再開し、該当プログラムの「いいえ」ボタンを押下してメモリリークを伴う処理を実行させます。
キャプチャ0.png

4.処理実行後のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次にネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行後のスナップショットを作成します。
キャプチャ2.PNG

5.スナップショットの比較
ネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「割り当て(相違)」列の↑項目を押下し、スナップショット間のヒープの差分を表示させます。
キャプチャ3.PNG
キャプチャ4.PNG

本差分情報により、Win32Project1.cppの9行目で確保したchar配列のメモリ領域が解放されず、256バイトのメモリリークが発生していることが確認出来ました。

70
67
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
70
67