zoukankan      html  css  js  c++  java
  • 【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.

  • 相关阅读:
    c++之五谷杂粮4---explicit
    ping
    Swift常量和变量
    Swift数据类型简介
    Swift 注释
    Swift标示符以及关键字
    xcode简介
    认识Swift
    Android_adb详解
    详解Android AM命令
  • 原文地址:https://www.cnblogs.com/xjsxjtu/p/3893351.html
Copyright © 2011-2022 走看看