Skip to main content

IAR Embedded Workbench for Arm 9.70.x

ヒープメモリのリークの検出

このセクションの内容:
説明

アプリケーション内の選択したポイントに参照を持たないヒープブロックがあるか否かをチェックします。

チェックを実行する理由

リークしたヒープブロックは参照できなくなるため、使用したり解放することができません。このチェックを使用して、ヒープブロックへの参照を検出し、参照されていないと思われるブロックを報告します。リークの検出で潜在的なあらゆるメモリリークを見つけることはできない点に注意してください。参照されていないと思われるヒープブロックが実際は参照されていて、参照されているように見えるヒープブロックが実際はリークしていることがあります。

注記

現在リークチェッカーはマルチスレッド環境をサポートしていません。リークチェッカーは、ヒープブロックへのリファレンス用に、既知の RAMの場所をスキャンすることで動作します。リークチェッカーを実行するスレッドには、それ自身のスタックについての情報はありますが、ほかのスレッドのスタックについての情報はありません。不明な情報は、誤判定や検出漏れの結果になります。

使用方法

リンカオプション :‑‑debug_heap

IDE で、 [プロジェクト]>[オプション]>[ランタイム解析]>[ランタイム解析]

チェック済みヒープは、アプリケーション全体にわたって通常のヒープを置換します。チェック済みヒープには、追加のヒープとスタックリソースが必要です。アプリケーションに 10 KB 以上のヒープと 4 KB のスタックがあることを確認してください。

リークの検出チェックは手動で呼び出す必要があります。アプリケーションの終了時に呼び出すか、2 つのソースポイント間でリークしたヒープブロックを検出するために使用できます。これらの関数は iar_dlmalloc.h に定義されています。

  • void __iar_leaks_ignore_all(void);

    この関数を使用して、以降のヒープのリークチェックで無視する現在割り当てられたすべてのヒープブロックにマークを付けます。

  • void __iar_leaks_ignore_block(void *block);

    この関数を使用して、以降のヒープのリークチェックで無視する割り当てられた特定のヒープブロックにマークを付けます。

  • void __iar_check_leaks(void);

    この関数を使用して、リークがないかチェックします。

仕組み

チェック済みヒープは、アプリケーション全体にわたって通常のヒープを置換します。ヒープのリークアルゴリズムには以下の 3 つのフェーズがあります。

  1. ヒープをスキャンして、割り当てられたすべてのヒープブロックのリストを作成します。

  2. ヒープ内にアドレスがあるかどうか、静的に使用されるRAM、スタックなどをスキャンします。上記のリストにあるヒープブロックに一致するアドレスがある場合、それらはリストから削除されます。

  3. リストにある残りのヒープブロックをリークしたものとして報告します。

ライブラリにより提供されるチェック済みヒープを参照してください。

C-RUNランタイムエラー解析を使用するにあたってに記載された手順に従ってください。[デバッグヒープ]オプションを使用します。

これは、実行時に識別されるソースコードの一例です。

crs_heap_leak_Hom7.1_M16_1.PNG

C-RUN はメモリリークを報告します。これは、リストされるメッセージの一例です。

message_heap_leak_Hom7.1_M16_1.PNG