インテル® Inspector XE を使用して Windows* 向けアプリケーションのメモリーエラーを検出

この記事は、インテル® デベロッパー・ゾーンに公開されている「Find Windows* Memory Errors with Intel® Inspector XE」の日本語参考訳です。


インテル® Inspector XE は、Windows* 向けアプリケーションのどのようなメモリーエラーを検出できるか?

Windows* のメモリーエラー

メモリーエラー解析タイプの構成設定の説明

次の表は、各解析タイプの構成設定における目的、有用性、コスト (低、中、高、もしくは時間およびリソースの比率) を示しています。(設定はアルファベット順にリストされています)

設定 目的、有用性、コスト
Analyze stack accesses – スタックのアクセスを解析 Detect invalid memory accesses (不正メモリーアクセスを検出) が選択された時にのみ適用されます。

無効なもしくは初期化されていないスレッドのスタックへのアクセスを解析するために選択します。

以下の場合に役立ちます:

  • 可能な限り細部まで解析したい場合。
  • アプリケーションが alloca() を呼び出している場合。

コストです。

推奨事項:

  • アプリケーションを最初に解析する時に選択します。その後定期的に使用してもいいでしょう。
  • オートマティック変数を解析するために使用します。
Defer memory deallocation – メモリー割り当て解除の延期 (以前は、Byte limit before reallocation と呼ばれていました) Detect invalid memory accesses (不正メモリーアクセスを検出)Enable enhanced dangling pointer check (拡張ダングリング・ポインター・チェックを有効にする) が選択されている時にのみ適用されます。

インテル® Inspector XE が解放されたメモリーブロックをすぐに利用可能なメモリー・プールに戻すのを防止します。

これは、アプリケーションが解放したメモリーを再度利用しようとするのを見つけるのに役立ちます。

アプリケーションが多くの割り当て/解放を行う場合、コストが高くなります。

推奨事項: コストがそれほど高くない場合、解析の精度を高めるために使用します。

Detect invalid memory accesses – 不正メモリーアクセスを検出 (不正/初期化されていないアクセスの検出を区別する) 論理もしくは物理的に不正な読み込みや書き込み命令のメモリー参照の問題を検出するために使用します。

アプリケーションが有効なメモリーアクセスを行っていることを確認できます。

コストは中です。

推奨事項: 選択することを推奨します。


通常は初期化されないメモリーを初期化してしまうことで、アプリケーションの動作が変わる可能性があります。アプリケーションが通常は初期化されないメモリーを読み込む場合、次の振る舞いをするでしょう:

  • 単純に誤った計算を行う。
  • メモリーの値をポインターとして扱う場合、読み込んだ後、解析中にクラッシュする。
Detect leaks at application exit – アプリケーションの終了時にリークを検出 (以前は、Detect memory leaks upon application exit と呼ばれていました)

アプリケーションの実行が終了した時に、メモリーブロックは割り当てられているが解放されることのない問題を検出する際に使用します。

以下の場合に役立ちます:

  • メモリーが不足している場合。
  • 予想よりも多くのメモリーを使用しているように思われる場合。

特に Remove duplicates (複製を排除) のみと一緒に使用される場合、極めて低いコストです。

推奨事項: 選択することを推奨します。

Detect resource leaks – リソースのリークを検出 次の問題を検出する際に使用します:
  • カーネル・オブジェクトのハンドルが作成されているが、クローズされない場合。
  • GDI オブジェクトが作成されているが、クローズされない場合。

Windows* GUI アプリケーションの解析に役立ちます。

コストです。

推奨事項: アプリケーションを最初に解析する時に選択します。その後定期的に使用してもいいでしょう。

Detect still-allocated memory at application exit – アプリケーションの終了時にまだ割り当てられているメモリーを検出 (以前は、Report still-allocated memory at application exit と呼ばれていました) Detect leaks at application exit (アプリケーションの終了時にリークを検出) が選択された時にのみ適用されます。

アプリケーションの実行を停止した時に、まだアクセス可能なメモリーブロックが割り当てられているが、解放されていない問題を検出する際に使用します。

コストは、アプリケーションが実行を停止した時に、まだ割り当てられているメモリーブロックの数に比例して増加します。

推奨事項: メモリーの伸長を調査する際に使用します。

Detect uninitialized memory reads – 初期化されていないメモリーの読み込みを検出 (不正/初期化されていないアクセスの検出を区別する) Detect invalid memory accesses (不正メモリーアクセスを検出) が選択された時にのみ適用されます。

リード命令が初期化されていないメモリー位置にアクセスする問題を検出するために使用します。

以下の場合に役立ちます:

  • アプリケーションが予期しない動作となった場合。
  • 初期化されていないメモリーの内容を計算した際の確認のため。

コストです。

推奨事項: 選択しないことを推奨します。


通常は初期化されないメモリーを初期化してしまうことで、アプリケーションの動作が変わる可能性があります。アプリケーションが通常は初期化されないメモリーを読み込む場合、次の振る舞いをするでしょう

  • 単純に誤った計算を行う。
  • メモリーの値をポインターとして扱う場合、読み込んだ後、解析中にクラッシュする。
Enable enhanced dangling pointer check – 拡張ダングリング・ポインター・チェックを有効にする Detect invalid memory accesses (不正メモリーアクセスを検出) が選択された時にのみ適用されます。

アプリケーションが、論理的に解放されたメモリーにアクセスしようとしているか検出する際に使用します。

アプリケーションが多くのメモリー割り当てと解放を行い、Defer memory deallocation (メモリー割り当て解除の延期) リストの値がアプリケーションの割り当てるメモリー量よりも小さな場合、コストは高いかもしれません。

推奨事項: ダングリング・ポインターの影響により、アプリケーションが予期できない動作となる際に使用します。

  • メモリー解放の呼び出しをインターセプトし、実際の解放を遅らせることでアプリケーションの振る舞いを変えることができます。
  • 拡張ダングリング・ポインター・チェックは、new/delete と new[]/delete[] による割り当てと解放の組み合わせではサポートされません。
Enable guard zones – ガードゾーンを有効にする Detect invalid memory accesses (不正メモリーアクセスを検出) が選択された時にのみ適用されます。

インテル® Inspector XE が、割り当てられたメモリーブロックを越えるメモリーアクセスを検出した場合、オフセット情報を示すように Guard zone size と組み合わせて使用します。

以下の場合に役立ちます:

  • アプリケーションが予期しない動作となった場合。
  • Invalid memory access の問題を判別するため、ヒープ割り当てのより詳しいコンテキストが必要な場合。

コストは、割り当ての数に比例します。

推奨事項: 以下に該当しない限り選択します:

  • インテル® Inspector XE の実行時にメモリー不足が生じた。
  • アプリケーションが不安定になった。

  • アプリケーションの振る舞いを変えるかもしれません。
  • インテル® Inspector XE が使用するメモリーサイズを増やします。
  • インテル® Inspector XE は、割り当て空間の終わりにのみガードゾーンを作成します。割り当て空間の最初には作成しません。
Enable memory growth detection – メモリーの伸長検出を有効にする (以前は、Enable interactive memory growth detection と呼ばれていました) アプリケーション実行中の特定の時間範囲内で、メモリーブロックが割り当てられているが解放されていないことがあるかどうかを検出する機能を有効にする際に選択します。

選択すると、メモリーの利用パターンをモデル化し、トランザクションが完了した後にアプリケーションがすべてのメモリー割り当てを解放したことを確実に知ることができます。

Reset Growth Tracking と組み合わせて、解析中に Measure Growth ボタンを使用します。

コストです。

Enable on-demand leak detection – オンデマンドのリーク検出を有効にする (以前は、Enable on-demand memory leak detection と呼ばれていました) アプリケーション実行中の特定の時間範囲内で、メモリーブロックが割り当てられているが解放されておらずかつ参照できないか (ブロックを解放するために必要な有効なポインターがない) 、どうかを検出する機能を有効にする際に選択します。

終了しないアプリケーション、もしくはアプリケーションの部分的なメモリーリークをチェックする際に役立ちます。

Reset Leak Tracking と組み合わせて、解析中に Find Leaks ボタンを使用します。

コストは、割り当ての数に比例します。

Guard zone size – ガード・ゾーン・サイズ (以前は Guard zone byte size と呼ばれていました) Detect invalid memory accesses (不正メモリーアクセスを検出)Enable guard zones (ガードゾーンを有効にする) が選択されている時にのみ適用されます。

インテル® Inspector XE が、メモリー割り当てに関連した Invalid memory access の問題を特定するため、割り当てられたメモリーブロックにガードバイトを追加する Enable guard zones と組み合わせて使用します。

以下の場合に役立ちます:

  • アプリケーションが予期しない動作となった場合。
  • Invalid memory access の問題を判別するため、ヒープ割り当てのより詳しいコンテキストが必要な場合。

コストは、割り当ての数に比例します。

推奨事項: 以下に該当しない限り設定します:

  • インテル® Inspector XE の実行時にメモリー不足が生じた。
  • アプリケーションが不安定になった。

  • アプリケーションの振る舞いを変えるかもしれません。
  • インテル® Inspector XE が使用するメモリーサイズを増やします。
  • インテル® Inspector XE は、割り当て空間の終わりにのみガードゾーンを作成します。割り当て空間の最初には作成しません。
Maximum number of leaks shown in result – リークの最大数を表示 (以前は、Maximum memory leaks と呼ばれていました) 解析が終了した後、インテル® Inspector XE の結果に表示するリークの最大数を設定するために使用します。

ゼロに設定すると検出されたすべてのメモリーリークが表示されます。

コストは、リークの数に比例します。

推奨事項: すべてのリークをリストする場合以外は、デフォルト値を使用してください。

ヒント
デフォルト値を使用すると、管理できないほどのリーク数が生成されることがあります。Object Size を指定し表示されるメモリーリークをソートして、最も多いリークを見つけ、アプリケーションを再度調査してください。もしくは、on-demand leak detection 機能を有効にし、焦点を絞って最も大きなものを見つけます。

Remove duplicates – 重複を排除 Code Locations ペインで検出された問題をすべて表示するには、選択を解除します。

以下の場合は選択を解除します:

  • 時間に関連するすべてのスレッドと問題の発生を完全に視覚化する必要がある場合。
  • 時間的コストを抑えたい場合。ただし、重複エラー数が固有のエラーの数を上回るかもしれません。

推奨事項: 選択することを推奨します。

Revert to previous uninitialized memory algorithm – 初期化されない以前のメモリーアルゴリズムに戻す (非推奨です) Detect uninitialized memory reads (初期化されていないメモリー読み込みを検出) が選択された時にのみ適用されます。

現在の初期化されていないメモリー読み込み検出のアルゴリズムは、誤検出を減らしますが、解析時間とメモリーのオーバーヘッドを増加させます。以前のバージョンのアルゴリズムを使用する際に選択します。

推奨事項: 選択しないことを推奨します。

Stack frame depth – スタックフレームの深さ 検出されたエラーのコールスタック・コンテキストを減らしたり、増やしたりする際に使用します。

高度なオブジェクト指向のアプリケーションを解析する際、高い値にすると便利です。

高い値にするとコストの影響はありません。

推奨事項: 大きな値は、アプリケーションのコールパスをすべて表示する際にのみ使用します。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください

関連記事