Log settingsDebug zoneには、ヒープメモリを確認するための専用のゾーンの設定があります。これを使用して、ヒープメモリの詳細な使用状況や、メモリ破壊を検出することができます。

 ヒープメモリにメモリブロックをアロケートすると、アロケートしたメモリブロックの前後に4バイトのマジックナンバーが自動的に書き込まれます。

Top guard Memory block Tail guard
A5 : A5 : A5 : A5 AA : AA : AA : AA

 このマジックナンバーが壊れていないかを検査することによりヒープメモリの検査を行わせることができます。この検査を行わせるには、Debug zoneで次のいずれかのゾーンを有効にします。

ZONE_HEAP_CHK

 このゾーンを有効にすると、free関数またはrealloc関数が呼び出されたとき、パラメータで指定されたメモリブロックの前後のマジックナンバーを検査し、壊れていればログメッセージを出力します。

Tail guardが壊れていた場合のログメッセージの例:

[HEAP] #### Tail guard is corrupted! ####
[HEAP] ####  00 aa aa aa
[HEAP] ####  Allocated by 0x5000ba9
[HEAP] ####  Size = 16
[HEAP] ####  Handle = 0x861086c
  • マジックナンバーが 00 : AA : AA : AA に変わっている。
  • 0x5000ba9番地のプログラムでアロケートされたメモリで、サイズは16バイト
  • メモリーブロックのアドレス = 0x861086c番地
 このメモリ破壊は次のプログラムで発生させたものです。
void main(void)
{
    char *p = malloc(16);
    *(p+16) = 0;
    free(p);
    while(1)
    {
        Idle();
    }
}

Top guardが壊れていた場合のログメッセージの例:

[HEAP] #### Top guard is corrupted! (0x00a5a5a5) ####
[HEAP] ####  Allocated by 0x5000ba9
[HEAP] ####  Size = 16
[HEAP] ####  Handle = 0x861086c
  • マジックナンバーが A5 : A5 : A5 : 00 に変わっている。
  • 0x5000ba9番地のプログラムでアロケートされたメモリで、サイズは16バイト
  • メモリーブロックのアドレス = 0x861086c番地
 このメモリ破壊は次のプログラムで発生させたものです。
void main(void)
{
    char *p = malloc(16);
    *(p-1) = 0;
    free(p);
    while(1)
    {
        Idle();
    }
}

ZONE_HEAP_LOG

 このゾーンを有効にすると、ZONE_HEAP_CHKの機能に加えて、malloc関数、calloc関数、realloc関数、free関数が呼び出されたときに次のようなログメッセージを自動的に出力します。
[HEAP]+malloc(16) at 5000ba9
[HEAP]-malloc(16) -> 0x861086c n=4 at 5000ba9
[HEAP]+free(0x861086c) at 5000bba
[HEAP]-free(0x861086c) n=3 at 5000bba
  • 0x5000ba9番地のプログラムから16バイトのmalloc関数が呼ばれた。
  • 0x861086c番地のメモリがアロケートされメモリブロックの総個数が4個になった。
  • 0x5000bba番地のプログラムからfree関数が呼ばれ、メモリブロックの総個数が3個になった。

ZONE_HEAP_ALL

 このゾーンを有効にすると、ZONE_HEAP_LOGの機能に加えて、malloc関数、calloc関数、realloc関数またはfree関数が呼び出されたとき、現在アロケートされているすべてのメモリーブロックのマジックナンバーを検査し、壊れていればログメッセージを出力します。
 ZONE_HEAP_ALLを有効にすると、大きなオーバーヘッドがあるので注意してください。

重要

  • アロケートされているメモリーブロックの総個数が8192個以内であれば、本項で説明した検査機能が動作します。
  • 8192個を超えるメモリーブロックがアロケートされたら、それ以降は再起動するまで本項で説明した検査機能は動作を停止しますが、メモリーのアロケート自体は動作を継続します。

関連事項

最終更新日:2021/05/31