Finding memory corruption with Valgrind Memcheck

Updated: April 19, 2023

Valgrind Memcheck detects many types of memory corruption errors, including invalid accesses, uses of undefined values, and incorrect freeing of memory. The IDE parses the Memcheck results that it receives from Valgrind and displays a list of memory errors.

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.

If your target image isn't configured to include the valgrind binaries and libraries, the IDE attempts to upload these components when you launch an application with a Valgrind tool enabled. For this to work, the target must have a writable filesystem.

To find memory corruption with Valgrind Memcheck:
  1. In the launch bar, expand the Launch Configuration dropdown (which is in the middle) and select the project for which you want to check memory.
  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 configure how the heap block data are presented.
  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.

If Track origins of uninitialized values is checked in the Memcheck tab, any invalid read or write error includes a stack trace of 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 errors detected 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 file at the indicated line. This feature lets you quickly find where an error occured or the associated memory 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.