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 分析: ファイルの後部には、全体的にlost 20バイトが確定しています. ファイルの前に記述された内容は、詳細にはmallocが1つあるがfreeには行かないことがわかる.
二、free mallocのないポインタ code 分析: ファイルの後部には、全体的に1つのエラー、0つのmalloc、1つのfreeがあります. ファイルの前に記述された内容は、詳細には無効なfreeがあることがわかります.
三、stack中、無効な読み取りで、エラーを提示しない code 分析: stackスタックの内容を読み取る、エラー を提示しない.
ローカル変数でstackに格納され、p[10]がスタックの長さを超えていないため、エラーは提示されていませんか?
四、heapスタックの中で、無効な読み取り、エラーを提示する code 分析: heapスタックの内容を読み取ると、エラーが表示され、無効な1バイトの読み取りが表示されます.位置はmallocの8バイトの後ろの2バイト目の です. mallocのデータはheapスタックにあります.
五、stackの、無効な書き込み code 分析: 運転中にエラーが発生し、Backtrace が印刷されます.全体として、5個のmalloc、0個のfree というエラーが表示されます.ファイルの前のエラーメッセージは、無効なreadがあり、4バイト読みました. このプロンプトのエラー情報とコードの中の情報は、よく一致していませんが、エラーであることがわかります.
六、heapスタック、無効な書き込み code 分析: プログラムの実行にエラーはありません heapスタックの内容を書くと、logはエラーを提示し、無効な1バイトの書き込みを提示し、位置はmallocの8バイトの後ろの2バイト目の である.
ここではvalgrindを使用してアプリケーション内の潜在的なエラー情報を検索し、例を挙げて説明します.
valgrindを使用してコードのメモリに関するエラーをよく検索することは、システムに移植した後のシステムの安定性にとって重要な意義があります.
usage
error specification
一、mallocはあるがfreeはない
#include <stdio.h>
#include <stdlib.h>
void main()
{
char *p = malloc(20);
sprintf(p, "%s", "test");
fprintf(stderr, "p:%s/n", p);
}
==26512== LEAK SUMMARY:
==26512== definitely lost: 20 bytes in 1 blocks.
==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のないポインタ
void main()
{
char p[] = "hello";
fprintf(stderr, "p:%s/n", p);
free(p);
}
==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.
==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中、無効な読み取りで、エラーを提示しない
void main()
{
char p[8] = "hello"; //p , "hello"
fprintf(stderr, "p10:%c/n", p[10]);
}
==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.
四、heapスタックの中で、無効な読み取り、エラーを提示する
void main()
{
char *p = malloc(8);
fprintf(stderr, "p10:%c/n", p[10]);
free(p);
}
==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.
五、stackの、無効な書き込み
void main()
{
char p[8] = "hello";
p[10]='a';
}
*** 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
==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.
==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スタック、無効な書き込み
void main()
{
char *p = malloc(8);
p[10]='a';
free(p);
}
==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)