Posted at

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

More than 3 years have passed since last update.


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バイトのメモリリークが発生していることが確認出来ました。