标签:style blog http color os io strong for
sudo apt-get install valgrind
example code:
/* memleak.c */ #include <stdlib.h> void* memleak(int n) { void *p = malloc(n); return p; }
/* main.c */ #include <stdio.h> #include <stdlib.h> void* memleak(int n); int main() { int i=0; void *p = NULL; for(i=0; i<10; i++) { p = memleak(100); printf("allocate memory address: %p\n", p); } return 0; }
Use ‘valgrind ./exe_binary [cmdline]‘ to check if memory leak happens:
josh@josh-VirtualBox:~/test_memleak$ gcc main.c memleak.c -O1 -o main.x josh@josh-VirtualBox:~/test_memleak$ valgrind ./main.x ==6726== Memcheck, a memory error detector ==6726== Copyright (C) 2002-2011, and GNU GPL‘d, by Julian Seward et al. ==6726== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==6726== Command: ./main.x ==6726== allocate memory address: 0x51f2040 allocate memory address: 0x51f20f0 allocate memory address: 0x51f21a0 allocate memory address: 0x51f2250 allocate memory address: 0x51f2300 allocate memory address: 0x51f23b0 allocate memory address: 0x51f2460 allocate memory address: 0x51f2510 allocate memory address: 0x51f25c0 allocate memory address: 0x51f2670 ==6726== ==6726== HEAP SUMMARY: ==6726== in use at exit: 1,000 bytes in 10 blocks ==6726== total heap usage: 10 allocs, 0 frees, 1,000 bytes allocated ==6726== ==6726== LEAK SUMMARY: ==6726== definitely lost: 1,000 bytes in 10 blocks ==6726== indirectly lost: 0 bytes in 0 blocks ==6726== possibly lost: 0 bytes in 0 blocks ==6726== still reachable: 0 bytes in 0 blocks ==6726== suppressed: 0 bytes in 0 blocks ==6726== Rerun with --leak-check=full to see details of leaked memory ==6726== ==6726== For counts of detected and suppressed errors, rerun with: -v ==6726== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
$ gcc main.c memleak.c -O1 -g -o main.x
$ valgrind --leak-check=full ./main.x
ATTENTION:
josh@josh-VirtualBox:~/test_memleak$ valgrind --leak-check=full ./main.x josh@josh-VirtualBox:~/test_memleak$ valgrind --leak-check=full ./x ==7209== Memcheck, a memory error detector ==7209== Copyright (C) 2002-2011, and GNU GPL‘d, by Julian Seward et al. ==7209== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==7209== Command: ./x ==7209== allocate memory address: 0x51f2040 allocate memory address: 0x51f20f0 allocate memory address: 0x51f21a0 allocate memory address: 0x51f2250 allocate memory address: 0x51f2300 allocate memory address: 0x51f23b0 allocate memory address: 0x51f2460 allocate memory address: 0x51f2510 allocate memory address: 0x51f25c0 allocate memory address: 0x51f2670 ==7209== ==7209== HEAP SUMMARY: ==7209== in use at exit: 1,000 bytes in 10 blocks ==7209== total heap usage: 10 allocs, 0 frees, 1,000 bytes allocated ==7209== ==7209== 1,000 bytes in 10 blocks are definitely lost in loss record 1 of 1 ==7209== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7209== by 0x4005A3: memleak (memleak.c:5) ==7209== by 0x400573: main (main.c:12) ==7209== ==7209== LEAK SUMMARY: ==7209== definitely lost: 1,000 bytes in 10 blocks ==7209== indirectly lost: 0 bytes in 0 blocks ==7209== possibly lost: 0 bytes in 0 blocks ==7209== still reachable: 0 bytes in 0 blocks ==7209== suppressed: 0 bytes in 0 blocks ==7209== ==7209== For counts of detected and suppressed errors, rerun with: -v ==7209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2) josh@josh-VirtualBox:~/test_memleak$
You can see the call stack, which means where memory leak happens
main() ==> memleak() ==> malloc()
Use the same method as above.
【Valgrind】How to check memory leak and where it's in 10 mins,布布扣,bubuko.com
【Valgrind】How to check memory leak and where it's in 10 mins
标签:style blog http color os io strong for
原文地址:http://www.cnblogs.com/xjsxjtu/p/3893351.html