Linux: Check For Memory Leaks In Programs

How do I check my C programs under Linux operating systems for memory leaks? How do I debug and profiling Linux executables?

You need to use a tool called Valgrind. It is memory debugging, memory leak detection, and profiling tool for Linux and Mac OS X operating systems. Valgrind is a flexible program for debugging and profiling Linux executables. From the official website:

The Valgrind distribution currently includes six production-quality tools: a memory error detector, two thread error detectors, a cache and branch-prediction profiler, a call-graph generating cache profiler, and a heap profiler. It also includes two experimental tools: a heap/stack/global array overrun detector, and a SimPoint basic block vector generator. It runs on the following platforms: X86/Linux, AMD64/Linux, PPC32/Linux, PPC64/Linux, and X86/Darwin (Mac OS X).

How Do I Install Valgrind?

Type the following command under CentOS / Redhat / RHEL Linux:
# yum install valgrind
Type the following command under Debian / Ubuntu Linux:
# apt-get install valgrind

How Do I use Valgrind?

If you normally run your program like this:
./a.out arg1 arg2
/path/to/myapp arg1 arg2
Use this command line to turn on the detailed memory leak detector:
valgrind --leak-check=yes ./a.out arg1 arg2
valgrind --leak-check=yes /path/to/myapp arg1 arg2

You can also set logfile:
valgrind --log-file=output.file --leak-check=yes --tool=memcheck ./a.out arg1 arg2
Most error messages look like the following:
cat output.file
Sample outputs:

==43284== Memcheck, a memory error detector
==43284== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==43284== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==43284== Command: ./a.out
==43284== Parent PID: 39695
==43284== Invalid write of size 4
==43284==    at 0x4004B6: f (in /tmp/a.out)
==43284==    by 0x4004C6: main (in /tmp/a.out)
==43284==  Address 0x4c1c068 is 0 bytes after a block of size 40 alloc'd
==43284==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
==43284==    by 0x4004A9: f (in /tmp/a.out)
==43284==    by 0x4004C6: main (in /tmp/a.out)
==43284== HEAP SUMMARY:
==43284==     in use at exit: 40 bytes in 1 blocks
==43284==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==43284== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==43284==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
==43284==    by 0x4004A9: f (in /tmp/a.out)
==43284==    by 0x4004C6: main (in /tmp/a.out)
==43284== LEAK SUMMARY:
==43284==    definitely lost: 40 bytes in 1 blocks
==43284==    indirectly lost: 0 bytes in 0 blocks
==43284==      possibly lost: 0 bytes in 0 blocks
==43284==    still reachable: 0 bytes in 0 blocks
==43284==         suppressed: 0 bytes in 0 blocks
==43284== For counts of detected and suppressed errors, rerun with: -v
==43284== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)

Sample C Program

Create test.c:

#include <stdlib.h>
  void f(void)
     int* x = malloc(10 * sizeof(int));
     x[10] = 0;        // problem 1: heap block overrun
  }                    // problem 2: memory leak -- x not freed
  int main(void)
     return 0;

You can compile and run it as follows to detect problems:
gcc test.c
valgrind --log-file=output.file --leak-check=yes --tool=memcheck ./a.out
vi output.file


  • See valgrind project web site and the valgrind man page for more information:

man valgrind

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 10 comments so far... add one

CategoryList of Unix and Linux commands
Disk space analyzersdf duf ncdu pydf
File Managementcat cp mkdir tree
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Modern utilitiesbat exa
Network UtilitiesNetHogs dig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg glances gtop jobs killall kill pidof pstree pwdx time vtop
Searchingag grep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
10 comments… add one
  • alireza Apr 29, 2010 @ 7:23

    you can use gdb programm to check it
    the way of use type in konsole gdb programname

  • vasiauvi May 1, 2010 @ 6:53

    memory leak is when a program uses MORE RAM than it should?
    For example I’ve upgraded to Lucid and i have a service “polkitd” that with time is using 600MB of RAM…This is a memory leak from my side, but until now after trying for 3 days the issue persist!

  • vasiauvi May 3, 2010 @ 14:12

    I think in my case there is a memory leak because this polkitd is a program which is not releasing memory. Is starting with 1MB and is taking memory with every minute until is reaching in a state when I can’t use my computer any more!

    Maybe you have an idea about this

  • vasiauvi May 3, 2010 @ 16:51

    I’ve solved the issue!

    • foorfo Aug 2, 2013 @ 20:42

      When you write in one blog or forum about a problem you have when you solved the problem can be useful for other people if you say how you solved it.


      • vasiauvi Aug 3, 2013 @ 9:28

        You are right. But the answer is in the thread that I’ve linked above. Nevertheless, also as far as I remember, “The idea is that the problem on my system was .pulse folder. After deleting this folder and also .dbus folder everything was OK.”.

        So the issue was resolved by deleting .pulse folder. But now I am using Ubuntu 13.04 and it’s working fine.

        Have a nice weekend!

  • VIKAS Jun 13, 2011 @ 16:52


    I just tried the below command

    valgrind –log-file=output.file –leak-check=yes –tool=memcheck /usr/bin/yum install ntpd -y

    and this gave me this :-
    definitely lost: 90 bytes in 3 blocks
    indirectly lost: 0 bytes in 0 blocks
    possibly lost: 2,811,245 bytes in 34,432 blocks
    still reachable: 198,408 bytes in 6,191 blocks
    suppressed: 0 bytes in 0 blocks

    Now, this shows me 2,811,245 bytes (2.68 MB) is possibly lost.
    I don’t think this should be the case, just a simple command has this much possible memory leak.

    • k Sep 13, 2011 @ 11:31

      first of all: “possibly”, not “definitely”

  • Ringo May 7, 2012 @ 13:13

    How can we use valgrind for a specific time period?? I want to use the valgrind with my process for specific time, i don’t want to stop the process with ctrl+C. I want to use some option to run the valgrind for specific amount of time and it should exit gracefully.

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum