Finding memory leaks with Valgrind Memcheck

Updated: April 19, 2023

Valgrind Memcheck tracks all allocated heap blocks so it can find memory leaks when the program terminates. The tool writes the leak details into the analysis results, which the IDE then parses to display leak information.

Note: All Valgrind tools can be loaded and run from the command line. However, using the IDE is more convenient because it automates much of the setup by setting Valgrind command options based on UI fields and by copying the analysis results into the host workspace.
To find memory leaks with Valgrind Memcheck:
  1. In the launch bar, expand the Launch Configuration dropdown (which is in the middle) and select the project in which you want to check for leaks.
  2. In the Launch Target dropdown (on the right), select the target for running your application.
  3. In the Launch Mode dropdown (on the left), select Check.
  4. Click the Edit button (Icon: Edit button) on the right of the Launch Configuration dropdown.
  5. In the configuration editor window, access the Valgrind controls by clicking the Check tab on the right and then the Valgrind radio button near the top of this tab.
  6. Select Memcheck from the Tool to run dropdown.
  7. Optional: You can change any settings to customize what gets reported in the Valgrind results.
    The Memcheck tab lets you enable leak checking and the reporting of individual leak types (e.g., definite, possible).
  8. Click OK to save the configuration changes and close the window.
  9. In the launch bar, click the Check button (Icon: Check button).

The IDE switches to the QNX Analysis perspective. If necessary, the IDE first builds the binary before uploading it to the target. To analyze the application, the IDE instructs Valgrind to execute the uploaded binary with Memcheck instrumentation. Then, it creates a new session for storing the Valgrind results; this session is displayed in the Analysis Sessions view. When the program terminates, Valgrind writes the results to a log file, which the IDE copies into the directory for the new session.

The memory error details are listed in the Valgrind view. All error summaries contain the Valgrind icon (Icon: Valgrind) followed by a descriptive message and the PID of the Valgrind process. On the left of the icon, you can click the arrow to display a stack trace of where the error was detected. The depth of the displayed call chain is determined by the Callers in stack trace field in the General Options tab.

For leaks, the error summary states the number of lost bytes and blocks as well as the leak type. The stack trace shows where the memory was allocated:

Screenshot of Valgrind view showing the error summary and stack trace for an invalid write error

The stack traces should include location information for lost blocks allocated within functions of shared libraries. If you don't see this information, you must manually configure the loading of debug symbols.

If you double-click a trace line that has source file information, the IDE opens the source file at the indicated line. This feature lets you quickly find where a lost block was allocated.

Note: You can run multiple Valgrind sessions concurrently, using the same tool or different tools, on the same application or different applications. Valgrind log files always contain the PIDs of the Valgrind processes, so their names are always distinct.