valgrindの使用及びエラー情報分析


転載する時、出典と作者の連絡先を明記してください.http://blog.csdn.net/mimepp作者連絡先:YU TAO
ここではvalgrindを使用してアプリケーション内の潜在的なエラー情報を検索し、例を挙げて説明します.
valgrindを使用してコードのメモリに関するエラーをよく検索することは、システムに移植した後のシステムの安定性にとって重要な意義があります.
usage
  • x 86プラットフォーム
  • まず自分のアプリケーションをコンパイルします
  • コマンドライン:
  • valgrind --log-file=1 --tool=memcheck ./a.out


  • error specification
    一、mallocはあるがfreeはない
  • code
    #include <stdio.h>
    #include <stdlib.h>

    void main()
    {
    char *p = malloc(20);
    sprintf(p, "%s", "test");
    fprintf(stderr, "p:%s/n", p);
    }
  • 分析:
  • ファイルの後部には、全体的にlost 20バイトが確定しています.
    ==26512== LEAK SUMMARY:
    ==26512== definitely lost: 20 bytes in 1 blocks.
  • ファイルの前に記述された内容は、詳細にはmallocが1つあるがfreeには行かないことがわかる.
    ==26512== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
    ==26512== malloc/free: in use at exit: 20 bytes in 1 blocks.
    ==26512== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.

  • 二、free mallocのないポインタ
  • code
    void main()
    {
    char p[] = "hello";
    fprintf(stderr, "p:%s/n", p);
    free(p);
    }
  • 分析:
  • ファイルの後部には、全体的に1つのエラー、0つのmalloc、1つのfreeがあります.
    ==26786== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
    ==26786== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==26786== malloc/free: 0 allocs, 1 frees, 0 bytes allocated.
  • ファイルの前に記述された内容は、詳細には無効なfreeがあることがわかります.
    ==26786== Invalid free() / delete / delete[]
    ==26786== at 0x402265C: free (vg_replace_malloc.c:323)
    ==26786== by 0x804841F: main (in /home/yutao/test/a.out)

  • 三、stack中、無効な読み取りで、エラーを提示しない
  • code
    void main()
    {
    char p[8] = "hello"; //p , "hello"
    fprintf(stderr, "p10:%c/n", p[10]);
    }
  • 分析:
  • stackスタックの内容を読み取る、エラー
    ==27452== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
    ==27452== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==27452== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
  • を提示しない.
  • ローカル変数でstackに格納され、p[10]がスタックの長さを超えていないため、エラーは提示されていませんか?

  • 四、heapスタックの中で、無効な読み取り、エラーを提示する
  • code
    void main()
    {
    char *p = malloc(8);
    fprintf(stderr, "p10:%c/n", p[10]);
    free(p);
    }
  • 分析:
  • heapスタックの内容を読み取ると、エラーが表示され、無効な1バイトの読み取りが表示されます.位置はmallocの8バイトの後ろの2バイト目の
    ==27744== Invalid read of size 1
    ==27744== at 0x804842A: main (in /home/yutao/test/a.out)
    ==27744== Address 0x4190032 is 2 bytes after a block of size 8 alloc'd
    ==27744== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
    ==27744== by 0x8048420: main (in /home/yutao/test/a.out)
    ==27744==
    ==27744== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
    ==27744== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==27744== malloc/free: 1 allocs, 1 frees, 8 bytes allocated.
  • です.
  • mallocのデータはheapスタックにあります.


  • 五、stackの、無効な書き込み
  • code
    void main()
    {
    char p[8] = "hello";
    p[10]='a';
    }
  • 分析:
  • 運転中にエラーが発生し、Backtrace
    *** stack smashing detected ***: ./a.out terminated
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0x412d138]
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0x412d0f0]
    ./a.out[0x80483d6]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0x4056450]
    ./a.out[0x8048331]
    ======= Memory map: ========
    04000000-0401a000 r-xp 00000000 08:06 682589 /lib/ld-2.7.so
  • が印刷されます.
  • 全体として、5個のmalloc、0個のfree
    ==27918== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 13 from 1)
    ==27918== malloc/free: in use at exit: 892 bytes in 5 blocks.
    ==27918== malloc/free: 5 allocs, 0 frees, 892 bytes allocated.
    ==27918== LEAK SUMMARY:
    ==27918== definitely lost: 0 bytes in 0 blocks.
    ==27918== possibly lost: 0 bytes in 0 blocks.
    ==27918== still reachable: 892 bytes in 5 blocks.
  • というエラーが表示されます.
  • ファイルの前のエラーメッセージは、無効なreadがあり、4バイト読みました.
    ==27918== Invalid read of size 4
    ==27918== at 0x40151F3: (within /lib/ld-2.7.so)
    ==27918== by 0x4005C69: (within /lib/ld-2.7.so)
    ==27918== by 0x4007A97: (within /lib/ld-2.7.so)
    ==27918== by 0x4011543: (within /lib/ld-2.7.so)
    ==27918== by 0x400D5D5: (within /lib/ld-2.7.so)
    ==27918== by 0x4010F5D: (within /lib/ld-2.7.so)
    ==27918== by 0x414E291: (within /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== by 0x400D5D5: (within /lib/ld-2.7.so)
    ==27918== by 0x414E454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== by 0x412A4D8: (within /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== by 0x412A4D8: (within /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== by 0x412A669: backtrace (in /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== by 0x40A3B91: (within /lib/tls/i686/cmov/libc-2.7.so)
    ==27918== Address 0x4190038 is 16 bytes inside a block of size 19 alloc'd
  • このプロンプトのエラー情報とコードの中の情報は、よく一致していませんが、エラーであることがわかります.


  • 六、heapスタック、無効な書き込み
  • code
    void main()
    {
    char *p = malloc(8);
    p[10]='a';
    free(p);
    }
  • 分析:
  • プログラムの実行にエラーはありません
  • heapスタックの内容を書くと、logはエラーを提示し、無効な1バイトの書き込みを提示し、位置はmallocの8バイトの後ろの2バイト目の
    ==28351== Invalid write of size 1
    ==28351== at 0x80483CA: main (in /home/yutao/test/a.out)
    ==28351== Address 0x4190032 is 2 bytes after a block of size 8 alloc'd
    ==28351== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
    ==28351== by 0x80483C0: main (in /home/yutao/test/a.out)
  • である.