Learn Valgrind – The Best Code Profiling Tool for C/C++ Programmers

Welcome friends. In this Linux tutorial, we’ll teach you about a special technique known as code profiling and discuss Valgrind which is the best-known code profiling tool available on Linux platforms.

Code profiling helps you improve the space and time complexity of a program. It lets you isolate the bottlenecks in your code.

As you know, in C/C++ programming world, performance is the key element to classify these languages from other high-level languages. C/C++ developers remain busy in tuning their code to run faster.

But you can’t always rely on human skills to optimize your program for performance. So it’s inevitable to use code profiling tools like Valgrind. Let’s learn it today.

Code profiling tools allow dynamic analysis of code. They not only support run-time analysis but also work as a leak checker. You can use them to find memory leakage in your source code.

Before we go into the details of Valgrind, let’s first understand the concept of code profiling and leak-checker in detail.

What is code profiling?

Code Profiling Using Valgrind.

Code Profiling Using Valgrind.

Code profiling is an essential facet of programming. Some of you may already know about code profiling yet few of us could wonder what it is. Code profiling is the process to determine which part of the program is depleting resources. And it can expose the program sections which are consuming time within the application.

For example, say your program spends half of the time in string-handling routines. And there is a possibility to stimulate these functions by 10 percent. It means the overall application’s execution time will improve by 5 percent.

In the next sections, we’ll discuss Valgrind commands and some useful tips-tricks for code profiling and leak detection.

What is Valgrind?

It is an open source framework, popular code profiling, and leak checker tool. You can instantly use it to detect dynamic memory and threading bugs, and profile application in detail. Alternatively, you can utilize it to develop new tools.

So this tool offers much more than just code profiling and finding leaks.

How to install Valgrind?

You can install it using the Package manager for your OS, but we’ll guide you to build it from the source code. It will help when you run and debug your program on multiple OS.

Follow the steps given below to download and build source code.

Valgrind installation steps.

  • Pull Valgrind source archive file to get the source.
  • Unpack the archive to extract the files onto your system.
  • Run “./configure” command to prepare build configurations.
  • Use the make command to start the build, just like you use to do.
  • Run <sudo make install> to install it onto your system.

Alternatively, you can use the below automated script to build and install Valgrind.

Shell Script for Installing Valgrind.

# 1) Fetch the source (try wget if curl is not available).
curl -O http://valgrind.org/downloads/valgrind-3.6.1.tar.bz2

# Run md5sum to ensure it equals the one on the site.
md5sum valgrind-3.6.1.tar.bz2

# 2) Uncompress it.
tar -xjvf valgrind-3.6.1.tar.bz2

# Enter into the freshly created folder.
cd valgrind-3.6.1

# 3) Launch configure to set up prerequisites.

# 4) To perform, run the make command.

# 5) Finally install it with root user.
sudo make install

Valgrind Command Syntax and Options.

Once you successfully make theValgrind, you can explore the various commands and options it brings to the plate. Here we are presenting most needed and useful one for you.


valgrind [options] ./[exe_fileName]

Commands and Options.

1. Check Valgrind version installed on the system.

valgrind ls

2. Command to create a log file.

[exe_fileName] > [log_fileName] 2>&1

3. Display heap memory leaks with description.

valgrind --leak-check=full/yes/no ./exe_fileName>log.txt 2>&1

4. Option to include similar kind of errors.


5. Option to extend the size of the error report.


6. Command to print extra information about the source of defects.


7. Option to log a particular kind of leak detail.


The <set> can accept any of the following values.

* Comma-separated list of one or more of the following.
  -definite, indirect, possible, reachable.
* Use "all" to specify all leak kinds.
* Use "none" for the empty set.

The default value for <set> is --show-leak-kinds=definite, possible.

8. Check the error frequency.


You can use -v option to query the number of times each error occurred. When execution finishes, you can view all the reports along with error occurrence counts in a sorted manner. This makes it easy to analyze errors which occur more frequently.

9. Increase limit for error detection.


Valgrind simply ceases to detect errors after 1,000 different errors are viewed, or 10,000,000 errors in total have been seen. In this situation, you might want to break your program and fix it. Because Valgrind won't report anything else useful after this.

Note: The 1,000/10,000,000 limits apply after suppressed errors are removed. The header file "m_errormgr.c" contains the definition of these limits. You can modify them if necessary.

10. Run Valgrind with GDB.


You can use this option to run GDB with Valgrind.

Don’t presume that we are now closer to the end of the article. There is still one more crucial concept which we want to touch upon in the next section.

What is Suppression and why it is needed?

So far we’ve seen a lot of code profiling and leak checker stuff. Now the turn is to suppress errors that you don’t want to see. These are the leaks outside of your code i.e. in shared libraries and are false positive.

Suppression Example.

For example, the code profiling tool detects many issues in the system libraries, such as the C library, which come pre-installed with your OS.

You can’t fix these defects, but you can hide these errors. So Valgrind brings the concept of suppression to hide such errors which are outside of your purview, or you do not want to see.

Steps for suppression.

1. Run your program using the following command.

valgrind -v –-leak-check=yes --gen-suppressions=yes ./exeName

This command produces the suppression code for each and every error it finds in your program.

2. Now locate the system library errors that we are not going to fix. Copy suppression code for those errors in a separate file.

3. Next, save the above file with .supp extension.

4. Again run your program with the following command.

valgrind -v --leak-check=yes --gen-suppressions=yes suppressions=/path/file.supp ./exeName

5. This time, Valgrind will ignore all the errors which are in the suppression file. And you will only see the suppressed error count instead of the defects in the end.

Summary – Valgrind as a Profiling and Leak Checker Tool.

We wish that there is something new for you to learn from the above extract about Valgrind. And you could apply this knowledge in your production environment.

Our team is already benefiting from this fantastic code profiling tool, and this article is the crux of their real-time experience with it. In the end, we request you to share this post with your friends and on the social media of your choice.

Keep Optimizing,