Valgrind 3.26 released
We are pleased to announce a new release of Valgrind, version 3.26.0, available from https://valgrind.org/downloads/current.html
This release adds an upgrade to GPL version 3, build control for html and/or pdf docs, added LibVEX_set_VexControl, removed Iop_Clz32/64 and Iop_Ctz32/64, integrated LTP v20250930, 13 new Linux syscall wrappers, new --modify-fds=yes, use log output protocol 6 with --xml=yes, new --track-fds=bad, gdb qExecAndArgs packet support, rewrite of DWARF inlined subroutine handling, new vgstack utility, handling of aligned allocation with size of zero changed, checks for C23 free_sized and free_aligned_sized.
See the release notes below for details of the changes.
Our thanks to all those who contribute to Valgrind's development.
This release represents a great deal of time, energy and effort on the part of many people. It was a busy release, with more than 400 commits by 12 people, fixing 90 bugs.
Happy and productive debugging and profiling,
\-- The Valgrind Developers
Release 3.26.0 (24 Oct 2025)
\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~
This release supports X86/Linux, AMD64/Linux, ARM32/Linux, ARM64/Linux, PPC32/Linux, PPC64BE/Linux, PPC64LE/Linux, S390X/Linux, MIPS32/Linux, MIPS64/Linux, RISCV64/Linux, ARM/Android, ARM64/Android, MIPS32/Android, X86/Android, X86/Solaris, AMD64/Solaris, AMD64/MacOSX 10.12, X86/FreeBSD, AMD64/FreeBSD and ARM64/FreeBSD There is also preliminary support for X86/macOS 10.13, AMD64/macOS 10.13 and nanoMIPS/Linux.
* ==================== CORE CHANGES ===================
* Upgrade to the GNU General Public License version 3.
* Control building documentation. When using make dist set the Makefile BUILD_DOCS to none, all or html. none, does not build any documentation. all, builds all documentation. html, builds HTML docs but skips building PDFs. See also README_DEVELOPERS.
* New VEX API function LibVEX_set_VexControl
* The deprecated IROps: Iop_Clz32/64 and Iop_Ctz32/64 have been removed
* The Linux Test Project (LTP) integration has been updated to v20250930. The test output has been made compatible with bunsen. Various issues with the linux syscall wrappers have been fixed.
New Linux syscall wrappers for: cachestat, futex_waitv, listmount, mount_setattr, mseal, quotactl_fd, remap_file_pages, setdomainname, statmount, swapoff, swapon, sysfs and ustat.
* --modify-fds=yes has been added. It acts like --modify-fds=high (the highest available file descriptor is returned first) except when when the lowers stdin/stdout/stderr (file descriptors 0, 1, 2) are available. With --modify-fds=yes 0, 1 or 2 are always returned first when still available before higher file descriptor numbers are.
* With --xml=yes log output protocol 6 is now always used (unlike protocol 5 which was only used with--track-fds). The main difference is that the xml output now contains error summaries. See also xml-output-protocol6.txt.
* Add "bad" option for --track-fds. When --track-fds=bad is specified, do not produce errors about unclosed file descriptors at program exit. Only produce errors for bad file descriptor usage, either double close or use of file descriptor that is (no longer) valid.
* vgdb will now handle the qExecAndArgs packet.
* DWARF inlined subroutine handling has been rewritten to work cross compile units. This should get rid of backtraces with "UnknownInlinedFun".
* ================== PLATFORM CHANGES =================
FreeBSD 15 (which is expected to ship in December 2025, after Valgrind 3.26 is released) contains a change to ptrace that affects use of Valgrind with vgdb. This impacts the mechanism that vgdb uses to interrupt Valgrind if all threads are blocked and you want to get back to the gdb prompt by hitting ctrl-c. This mechanism is no longer reliable. On arm64 Valgrind will crash with an assert. On amd64 syscalls may give spurious and incorrect return codes.
There is a workaround. Run the following command (as root).
sysctl
Post #24109
15