【valgrind】How to check memory leak and where it's in 10 mins

1. Install

sudo apt-get install valgrind

2. If memory leak

example code:

/* memleak.c */
#include <stdlib.h>
void* memleak(int n)
{
    void *p = malloc(n);
    return p;
}
memleak.c
/* 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
", p);
     }
     return 0;
}
main.c

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)
 

3. Where memory leak

$ gcc main.c memleak.c -O1 -g -o main.x 

$ valgrind --leak-check=full ./main.x

ATTENTION:

  • "-O1" to prevent from inline functions by optimization, "-g" to get line number of memory leak functions.
  • In one word, use "DEBUG" flavour instead of "release" while finding memleak.
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()

4. Find memory leak because of invoking 3rd-party library

Use the same method as above.

原文地址:https://www.cnblogs.com/xjsxjtu/p/3893351.html