關於valgrind的安裝和記憶體洩露分析
阿新 • • 發佈:2019-02-11
程式的安裝
如果使用的是tar包安裝. valgrind
# wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
# tar -jxvf valgrind-3.9.0.tar.bz2
# cd valgrind-3.9.0
# ./autogen.sh
# ./configure
# make; make install
使用命令:
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=./valgrind.log.`date +%m%d%s` ./gameserver
如果後臺起的話,也可以使用:
nohup valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=./valgrind.log.`date
+%m%d%s` ./gameserver &
error specification
一、有malloc,但未free
- code
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- char *p
= malloc(20);
- sprintf(p,"%s","test");
- fprintf(stderr,
- }
- 分析:
- ==26512== LEAK SUMMARY:
- ==26512== definitely lost: 20 bytesin 1 blocks.
在檔案之前描述的內容,細節可以看出,有1個malloc,但未去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/
- code
- 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.
在檔案之前描述的內容,細節可以看出,有一個無效的free。如下:
- ==26786== Invalid free()/
delete / delete[]
- ==26786== at 0x402265C: free(vg_replace_malloc.c:323)
- ==26786== by 0x804841F: main(in/home/eric/workspace/valgrind/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);
- }
- 分析:
- ==27744== Invalid read of size 1
- ==27744== at 0x804842A: main(in/home/eric/workspace/valgrind/test/a.out)
- ==27744== Address 0x4190032is 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/eric/workspace/valgrind/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';
- }
- 分析:
- *** 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
總體,會提示有1個錯誤,內容是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 bytesin
0 blocks.
- ==27918== possibly lost: 0 bytesin
0 blocks.
- ==27918== still reachable: 892 bytesin 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 0x4190038is 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/eric/workspace/valgrind/test/a.out)
- ==28351== Address 0x4190032is 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/eric/workspace/valgrind/test/a.out)