dbx コマンドによるデバッグ

RTC エラー

ブロック中のアドレス (aib)

意味 : メモリーリークの可能性がある。割り当てブロックの先頭への参照はないが、そのブロック内のアドレスへの参照が少なくとも 1 つ存在する。 

考えられる原因 : そのブロックの先頭を指す唯一のポインタが増分された。 

例 :


char *ptr;
main()
{
       ptr = (char *)malloc(4);
       ptr++;           /* ブロック中のアドレス (aib) */
}

レジスタ中のアドレス (air)

意味 : メモリーリークの可能性がある。割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しない。 

考えられる原因 : 割り当てられているブロックへの唯一の参照は、レジスタ内に含まれています。このようなことは、コンパイラがプログラム変数をメモリー内ではなくレジスタ内だけに保持している場合に発生し、その動作は正しいこともあります。最適化がオンになっている場合、コンパイラは局所変数や関数パラメータに対してこのような操作をよく行います。最適化がオンになっていないときにこのエラーが発生した場合は、実際のメモリーリークが考えられます。たとえば、割り当てられているブロックへの唯一のポインタが、そのブロックの解放前にスコープ外に出た場合にこのエラーが発生します。 

例 :


      if (i == 0) {
            char *ptr = (char *)malloc(4);
            /* ポインタがスコープ外に出た */
      }
    /* メモリーリークまたはレジスタ中のアドレス (air) */

不正解放 (baf)

意味 : 割り当てられたことのないメモリーを解放しようとした。 

考えられる原因 : free() または realloc() にヒープデータ以外のポインタを渡した。

例 :


      char a[4];
      char *b = &a[0];

      free(b);           /* 不正解放 (baf) */

重複解放 (duf)

意味 : すでに解放されているヒープブロックを解放しようとした。 

考えられる原因 : 同じポインタを使用して free() を 2 回以上呼び出した。C++ では、同じポインタに対して“delete”演算子を 2 回以上使用した。

例 :


      char *a = (char *)malloc(1);
      free(a);
      free(a);               /* 重複解放 (duf) */

境界整列を誤った解放 (maf)

意味 : 境界合わせされていないヒープブロックを解放しようとした。 

考えられる原因 : free() または realloc() に正しく境界合わせされていないポインタを渡した。malloc によって返されたポインタを変更した。

例 :


      char *ptr = (char *)malloc(4);
      ptr++;
      free(ptr);               /* 境界整列を誤った解放 (maf) */

境界整列を誤った読み取り (mar)

意味 : 適切に境界合わせされていないアドレスからデータを読み取ろうとした。 

考えられる原因 : ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスから、それぞれ 2 バイト、4 バイト、8 バイトを読み取った。 

例 :


      char *s = ”hello world”;
      int *i = (int *)&s[1];
      int j;

      j = *i;           /* 境界整列を誤った読み取り (mar) */

境界整列を誤った書き込み (maw)

意味 : 適切に境界合わせされていないアドレスにデータを書き込もうとした。 

考えられる原因 : ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスに、それぞれ 2 バイト、4 バイト、8 バイトを書き込んだ。 

例 :


      char *s = ”hello world”;
      int *i = (int *)&s[1];

      *i = 0;           /* 境界整列を誤った書き込み (maw) */

メモリーリーク (mel)

意味 : 割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しない。 

考えられる原因 : プログラムが使用されなくなったブロックを解放しなかった。 

例 :


char *ptr;
   ptr = (char *)malloc(1);
   ptr = 0;
/* メモリーリーク (mel) */

メモリー不足 (oom)

意味 : 利用可能な物理メモリーより多くのメモリーを割り当てようとした。 

考えられる原因 : プログラムがこれ以上システムからメモリーを入手できない。oom エラーは、malloc() からの戻り値が NULL かどうか検査していない (プログラミングでよく起きる誤り) ために発生する問題の追跡に役立ちます。

例 :


      char *ptr = (char *)malloc(0x7fffffff);
      /* メモリー不足 (oom), ptr == NULL */

非割り当てメモリーからの読み取り (rua)

意味 : 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーからデータを読み取ろうとした。 

考えられる原因 : ストレイポインタ (不正な値を持つポインタ)、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。 

例 :


      char c, *a = (char *)malloc(1);
      c = a[1];  /* 非割り当てメモリーからの読み取り (rua) */

非初期化メモリーからの読み取り (rui)

意味 : 初期化されていないメモリーからデータを読み取ろうとした。 

考えられる原因 : 初期化されていない局所データまたはヒープデータの読み取り。 

例 :


      foo()
      {   int i,  j;
          j = i;  /* 非初期化メモリーからの読み取り (rui) */
      }

読み取り専用メモリーへの書き込み (wro)

意味 : 読み取り専用メモリーにデータを書き込もうとした。 

考えられる原因 : テキストアドレスへの書き込み、読み取り専用データセクション (.rodata) への書き込み、読み取り専用として mmap されているページへの書き込み。

例 :


      foo()
      {  int *foop = (int *) foo;
         *foop = 0;/* 読み取り専用メモリーへの書き込み (wro) */
      }

非割り当てメモリーへの書き込み (wua)

意味 : 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーにデータを書き込もうとした。 

考えられる原因 : ストレイポインタ、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。 

例 :


      char *a = (char *)malloc(1);
      a[1] = `¥0';/* 非割り当てメモリーへの書き込み (wua) */