| .TH VALGRIND "1" "" "" |
| |
| .SH NAME |
| \fBvalgrind \fP- a memory debugger for x86-linux |
| |
| .SH SYNOPSIS |
| .nf |
| .fam C |
| \fIvalgrind\fP [\fIvalgrind\fP \fIoptions\fP] \fIyour-program\fP [\fIyour-program\fP \fIoptions\fP] |
| .fam T |
| .fi |
| |
| .SH DESCRIPTION |
| \fBvalgrind\fP is a flexible program for debugging and profiling Linux-x86 |
| executables. It consists of a core, which provides a synthetic x86 CPU |
| in software, and a series of "tools", each of which is a debugging or |
| profiling tool. The architecture is modular, so that new tools can be |
| created easily and without disturbing the existing structure. |
| |
| .PP |
| This manual page covers only basic usage and options. Please see the |
| HTML documentation for more comprehensive information. |
| |
| .SH INVOCATION |
| \fBvalgrind\fP is typically invoked as follows: |
| |
| valgrind program args |
| |
| This runs \fBprogram\fP (with arguments \fBargs\fP) under valgrind |
| using the \fBmemcheck\fP tool. \fBmemcheck\fP performs a range of |
| memory-checking functions, including detecting accesses to uninitialized |
| memory, misuse of allocated memory (double frees, access after free, |
| etc.) and detecting memory leaks. |
| |
| To use a different tool, use the \fB--tool\fP option: |
| |
| valgrind --tool=toolname program args |
| |
| The following tools are available: |
| |
| .RS |
| .TP |
| .B |
| - addrcheck |
| \fBaddrcheck\fP is similar to memcheck, but does not perform the same |
| granularity of memory checking. This will run faster and use less memory, |
| but may miss some problems that \fBmemcheck\fP would catch. |
| .TP |
| .B |
| - cachegrind |
| \fBcachegrind\fP is a cache simulator. |
| ." .TP |
| ." .B |
| ." - helgrind |
| ." \fBhelgrind\fP spots potential race conditions in your program. |
| .TP |
| .B |
| - lackey |
| \fBlackey\fP is a sample tool that can be used as a template for |
| generating your own tools. After the program terminates, it prints out |
| some basic statistics about the program execution. |
| .TP |
| .B |
| - massif |
| \fBmassif\fP is a heap profiler. It measures how much heap memory your |
| program uses. |
| .TP |
| .B |
| - memcheck |
| \fBmemcheck\fP is a fine-grained memory checker. |
| .TP |
| .B |
| - none |
| \fBnone\fP performs no function - it simply runs the program under |
| \fBvalgrind\fP. This is typically used for debugging and benchmarking |
| \fBvalgrind\fP. |
| .RE |
| |
| .SH COMMON CORE OPTIONS |
| |
| .TP |
| .B |
| --db-attach=<yes|no> [default: no] |
| When enabled, \fBvalgrind\fP will pause after every error shown and |
| print the line: |
| |
| .PP |
| .nf |
| .fam C |
| ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- |
| |
| .fam T |
| .fi |
| |
| .RS |
| Pressing Ret, or N Ret or n Ret, causes \fBvalgrind\fP not to start a |
| debugger for this error. |
| |
| .PP |
| Pressing Y Ret or y Ret causes \fBvalgrind\fP to start the debugger |
| (specified by the \fB--db-command\fP option) for the program at this |
| point. When you have finished with the debugger, quit from it, and |
| the program will continue. Trying to continue from inside the debugger |
| doesn't work. |
| |
| .PP |
| Pressing C Ret or c Ret causes \fBvalgrind\fP not to start the debugger |
| and \fBvalgrind\fP will not ask again. |
| |
| .PP |
| --db-attach=yes conflicts with --trace-children=yes. You can't use them |
| together. \fBvalgrind\fP refuses to start up in this situation. 1 May |
| 2002: this is a historical relic which could be easily fixed if it gets |
| in your way. Mail me and complain if this is a problem for you. |
| |
| .PP |
| Nov 2002: if you're sending output to a logfile or to a network socket, |
| I guess this option doesn't make any sense. Caveat emptor. |
| .RE |
| |
| .TP |
| .B |
| --db-command=<command> [default: gdb -nw %f %p] |
| Specify the debugger to use with the --db-attach command. The |
| default debugger is gdb. This option is a template that is expanded by |
| \fBvalgrind\fP at runtime. \fB%f\fP is replaced with the executable's |
| file name and \fB%p\fP is replaced by the process ID of the executable. |
| .TP |
| .B |
| |
| --error-limit=<yes|no> [default: yes] |
| When enabled, \fBvalgrind\fP stops reporting errors after 30000 in total, |
| or 300 different ones, have been seen. This is to stop the error tracking |
| machinery from becoming a huge performance overhead in programs with |
| many errors. |
| .TP |
| .B |
| |
| --gen-suppressions=<yes|no> [default: no] |
| When enabled, \fBvalgrind\fP will pause after every error shown and |
| print the line: |
| |
| .PP |
| .nf |
| .fam C |
| ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ---- |
| |
| .fam T |
| .fi |
| |
| .RS |
| Pressing Y Ret or y Ret will cause a suppression for this error to be |
| printed. This suppression can be cut-and-paste into a custom suppressions |
| file and used to suppress this error in subsequent runs. |
| |
| .P |
| Pressing Ret or n Ret or N Ret will cause no suppression to be printed. |
| |
| .P |
| Pressing C Ret or c Ret will cause no suppression to be printed and |
| \fBvalgrind\fP will not ask again. |
| .RE |
| |
| .TP |
| .B |
| -h --help |
| Show help for all options, both for the core and for the selected tool. |
| |
| .TP |
| .B |
| --help-debug |
| Show help for all options, both for the core and for the selected tool, |
| including options for debugging \fBvalgrind\fP. |
| |
| .TP |
| .B |
| --log-file=<filename> |
| Specifies that \fBvalgrind\fP should send all of its messages to the |
| specified file. In fact, the file name used is created by concatenating |
| the text filename, ".pid" and the process ID, so as to create a file |
| per process. The specified file name may not be the empty string. |
| |
| .TP |
| .B |
| --num-callers=<number> [default=12] |
| By default, \fBvalgrind\fP shows 12 levels of function call names to |
| help you identify program locations. You can change that number with |
| this option. This can help in determining the program's location in |
| deeply-nested call chains. Note that errors are commoned up using only |
| the top three function locations (the place in the current function, |
| and that of its two immediate callers). So this doesn't affect the total |
| number of errors reported. |
| |
| .RS |
| .PP |
| The maximum value for this is 50. Note that higher settings will make |
| \fBvalgrind\fP run a bit more slowly and take a bit more memory, but |
| can be useful when working with programs with deeply-nested call chains. |
| .RE |
| |
| .TP |
| .B |
| -q --quiet |
| Run silently, and only print error messages. Useful if you are running |
| regression tests or have some other automated test machinery. |
| |
| .TP |
| .B |
| --suppressions=<filename> [default: $PREFIX/lib/\fBvalgrind\fP/default.supp] |
| Specifies an extra file from which to read descriptions of errors to |
| suppress. You may specify up to 10 additional suppression files. |
| |
| .TP |
| .B |
| --tool=<toolname> [default: memcheck] |
| Specify which tool to use. The default tool is memcheck. |
| |
| .TP |
| .B |
| --trace-children=<yes|no> [default: no] |
| When enabled, \fBvalgrind\fP will trace into child processes. This is |
| confusing and usually not what you want, so is disabled by default. |
| |
| .TP |
| .B |
| --track-fds=<yes|no> [default: no] |
| Track file descriptor creation and deletion and produce a summary at the |
| end of the program execution of file descriptors that are still in use. |
| |
| .TP |
| .B |
| -v --verbose |
| Be more verbose. Gives extra information on various aspects of your |
| program, such as: the shared objects loaded, the suppressions used, |
| the progress of the instrumentation and execution engines, and warnings |
| about unusual behaviour. Repeating the flag increases the verbosity level. |
| |
| .TP |
| .B |
| --version |
| Show the version number of the \fBvalgrind\fP core. Tools can have |
| their own version numbers. There is a scheme in place to ensure that |
| tools only execute when the core version is one they are known to work |
| with. This was done to minimise the chances of strange problems arising |
| from tool-vs-core version incompatibilities. |
| |
| .SH ADDRCHECK OPTIONS |
| |
| .TP |
| .B |
| --freelist-vol=<number> [default: 1000000] |
| When the client program releases memory using free (in C) or delete |
| (C++), that memory is not immediately made available for re-allocation. |
| Instead it is marked inaccessible and placed in a queue of freed blocks. |
| The purpose is to delay the point at which freed-up memory comes back |
| into circulation. This increases the chance that \fBaddrcheck\fP will |
| be able to detect invalid accesses to blocks for some significant period |
| of time after they have been freed. |
| |
| .RS |
| This flag specifies the maximum total size, in bytes, of the blocks in |
| the queue. The default value is one million bytes. Increasing this |
| increases the total amount of memory used by \fBaddrcheck\fP but may |
| detect invalid uses of freed blocks which would otherwise go undetected. |
| .RE |
| |
| .TP |
| .B |
| --leak-check=<yes|no|summary|full> [default: summary] |
| Enables full, summary or no leak checking. When full (\fBfull\fP or |
| \fByes\fP options) checking is performed, details on all leaked blocks |
| are printed after the program finishes executing. When summary checking |
| is enabled, a summary of all leaked memory is printed. When no leak |
| checking is performed, no leaked memory details are produced. Disabling |
| leak checking can speed up your program execution. |
| |
| .TP |
| .B |
| --leak-resolution=<low|med|high> [default: low] |
| When doing leak checking, determines how willing \fBaddrcheck\fP is to |
| consider different backtraces to be the same. When set to \fBlow\fP, |
| the default, only the first two entries need match. When \fBmed\fP, |
| four entries have to match. When \fBhigh\fP, all entries need to match. |
| |
| .TP |
| .B |
| --partial-loads-ok=<yes|no> [default: yes] |
| Controls how \fBaddrcheck\fP handles word (4-byte) loads from addresses |
| for which some bytes are addressible and others are not. When enabled, |
| such loads do not elicit an address error. Instead, \fBaddrcheck\fP |
| considers the bytes corresponding to the illegal addresses as undefined, |
| and those corresponding to legal addresses are considered defined. |
| |
| .RS |
| When disabled, loads from partially invalid addresses are treated the |
| same as loads from completely invalid addresses: an illegal-address error |
| is issued, and the \fBaddrcheck\fP considers all bytes as invalid data. |
| .RE |
| |
| .TP |
| .B |
| --show-reachable=<yes|no> [default: no] |
| When performing full leak checking, print out details of blocks that are |
| leaked but still reachable. For details of what a reachable block is, |
| see the HTML documentation. |
| |
| .TP |
| .B |
| --workaround-gcc296-bugs=<yes|no> [default: no] |
| When enabled, assume that reads and writes some small distance below |
| the stack pointer \fB%esp\fP are due to bugs in gcc 2.96, and does not |
| report them. The "small distance" is 256 bytes by default. Note that gcc |
| 2.96 is the default compiler on some older Linux distributions (RedHat |
| 7.X, Mandrake) and so you may well need to use this flag. Do not use |
| it if you do not have to, as it can cause real errors to be overlooked. |
| Another option is to use a gcc/g++ which does not generate accesses below |
| the stack pointer. 2.95.3 seems to be a good choice in this respect. |
| |
| .SH MEMCHECK OPTIONS |
| \fBmemcheck\fP understands the same options as \fBaddrcheck\fP, along |
| with the following options: |
| |
| .TP |
| .B |
| --avoid-strlen-errors=<yes|no> [default: yes] |
| Enable or disable a heuristic for dealing with highly-optimized versions |
| of \fBstrlen\fP. These versions of \fBstrlen\fP can cause spurious |
| errors to be reported by \fBmemcheck\fP, so it's usually a good idea to |
| leave this enabled. |
| |
| .TP |
| .B |
| --cleanup=<yes|no> [default: yes] |
| \fBThis is a flag to help debug valgrind itself. It is of no use to |
| end-users\fP. When enabled, various improvments are applied to the |
| post-instrumented intermediate code, aimed at removing redundant value |
| checks. |
| |
| .SH CACHEGRIND OPTIONS |
| |
| .TP |
| .B |
| --D1=<size>,<associativity>,<line size> |
| Specify the size, associativity and line size of the level 1 data cache. |
| All values are measured in bytes. If this options is not specified, |
| the system value (as retrieved by the \fBCPUID\fP instruction) is used. |
| |
| .TP |
| .B |
| --I1=<size>,<associativity>,<line size> |
| Specify the size, associativity and line size of the level 1 instruction |
| cache. All values are measured in bytes. If this options is not |
| specified, the system value (as retrieved by the \fBCPUID\fP instruction) |
| is used. |
| |
| .TP |
| .B |
| --L2=<size>,<associativity>,<line size> |
| Specify the size, associativity and line size of the level 2 cache. |
| All values are measured in bytes. If this options is not specified, |
| the system value (as retrieved by the \fBCPUID\fP instruction) is used. |
| |
| .SH MASSIF OPTIONS |
| |
| .TP |
| .B |
| --alloc-fn=<name> |
| Specify a function that allocates memory. This is useful for functions |
| that are wrappers to \fBmalloc()\fP, which can fill up the context |
| information uselessly (and give very uninformative bands on the graph). |
| Functions specified will be ignored in contexts, i.e. treated as though |
| they were \fBmalloc()\fP. This option can be specified multiple times |
| on the command line, to name multiple functions. |
| |
| .TP |
| .B |
| --depth=<number> [default: 3] |
| Depth of call chains to present in the detailed heap information. |
| Increasing it will give more information, but \fBmassif\fP will run the |
| program more slowly, using more memory, and produce a bigger \fB.txt\fP |
| or \fB.hp\fP file. |
| |
| .TP |
| .B |
| --format=<text|html> [default: text] |
| Produce the detailed heap information in text or HTML format. The file |
| suffix used will be either \fB.txt\fP or \fB.html\fP. |
| |
| .TP |
| .B |
| --heap=<yes|no> [default: yes] |
| When enabled, profile heap usage in detail. Without it, the \fB.txt\fP |
| or \fB.html\fP file will be very short. |
| |
| .TP |
| .B |
| --heap-admin=<number> [default: 8] |
| The number of admin bytes per block to use. This can only be an |
| estimate of the average, since it may vary. The allocator used |
| by \fBglibc\fP requires somewhere between 4 to 15 bytes per block, |
| depending on various factors. It also requires admin space for freed |
| blocks, although \fBmassif\fP does not count this. |
| |
| .TP |
| .B |
| --stacks=<yes|no> [default: yes] |
| When enabled, include stack(s) in the profile. Threaded programs can |
| have multiple stacks. |
| |
| ." .SH HELGRIND OPTIONS |
| |
| ." .TP |
| ." .B |
| ." --private-stacks=<yes|no> [default: no] |
| ." Assume thread stacks are used privately. |
| |
| ." .TP |
| ." .B |
| ." --show-last-access=<yes|some|no> [default: no] |
| ." Show location of last word access on error. |
| |
| .SH LESS FREQUENTLY USED CORE OPTIONS |
| |
| .TP |
| .B |
| --alignment=<number> [default: 8] |
| By default \fBvalgrind\fP's malloc, realloc, etc, return 8-byte aligned |
| addresses. These are suitable for any accesses on x86 processors. Some |
| programs might however assume that malloc et al return 16- or more |
| aligned memory. These programs are broken and should be fixed, but if |
| this is impossible for whatever reason the alignment can be increased |
| using this parameter. The supplied value must be between 8 and 4096 |
| inclusive, and must be a power of two. |
| |
| .TP |
| .B |
| --branchpred=<yes|no> [default: no] |
| This option enables the generation of static branch prediction hints. |
| In theory this allows the real CPU to do a better job of running the |
| generated code, but in practice it makes almost no measurable difference. |
| It may have a large effect on some x86 implementations. |
| |
| .TP |
| .B |
| --chain-bb=<yes|no> [default: yes] |
| Enables basic-block chaining. If basic-block chaining is disabled, |
| the synthetic CPU returns to the scheduler after interpreting each basic |
| block. With basic block chaining enabled, it can immediately proceed to |
| the next basic block. This almost always results in a performance gain, |
| so it is enabled by default. |
| |
| .TP |
| .B |
| --command-line-only=<yes|no> [default: no] |
| Normally, \fBvalgrind\fP will look for command-line options in the |
| following locations: |
| .RS |
| .TP |
| - The \fBvalgrind\fP command line |
| .TP |
| - The \fB\.valgrindrc\fP file in the invocation directory |
| .TP |
| - The \fB\.valgrindrc\fP file in users home directory |
| .TP |
| - The \fB$VALGRIND_OPTS\fP environment variable |
| .P |
| |
| When this option is enabled, \fBvalgrind\fP will only look at the command |
| line for options. |
| .RE |
| |
| .TP |
| .B |
| --demangle=<yes|no> [default: yes] |
| Enable or disable automatic demangling (decoding) of C++ names. Enabled by |
| default. When enabled, \fBvalgrind\fP will attempt to translate encoded |
| C++ procedure names back to something approaching the original. The |
| demangler handles symbols mangled by g++ versions 2.X and 3.X. |
| |
| .TP |
| .B |
| --dump-error=<number> |
| After the program has exited, show gory details of the translation of |
| the basic block containing the \fB<number>\fP'th error context. When |
| used with --single-step=yes, can show the exact x86 instruction causing |
| an error. This is all fairly dodgy and doesn't work at all if threads |
| are involved. |
| |
| .TP |
| .B |
| --exec=<filename> |
| Specify the executable to run. If this is specified, it takes precedence |
| over the \fByour-program\fP executable from the command-line. If this is |
| not specified, \fBvalgrind\fP searches the path for the \fByour-program\fP |
| executable, just like a regular shell would. |
| |
| .TP |
| .B |
| --input-fd=<number> [default: 0, stdin] |
| Specify the file descriptor to use for reading input from the user. This |
| is used whenever \fBvalgrind\fP needs to prompt the user for a decision. |
| |
| .TP |
| .B |
| --log-fd=<number> [default: 2, stderr] |
| Specifies that \fBvalgrind\fP should send all of its messages to |
| the specified file descriptor. The default, 2, is the standard error |
| channel (stderr). Note that this may interfere with the client's own |
| use of stderr. |
| |
| .TP |
| .B |
| --log-socket=<ip-address:port-number> |
| Specifies that \fBvalgrind\fP should send all of its messages to the |
| specified port at the specified IP address. The port may be omitted, |
| in which case port 1500 is used. If a connection cannot be made to |
| the specified socket, \fBvalgrind\fP falls back to writing output to |
| the standard error (stderr). This option is intended to be used in |
| conjunction with the \fBvalgrind-listener\fP program. For further details, |
| see section 2.3 of the user manual. |
| |
| .TP |
| .B |
| --optimise=<yes|no> [default: yes] |
| When enabled, various improvements are applied to the intermediate code, |
| mainly aimed at allowing the simulated CPU's registers to be cached in |
| the real CPU's registers over several simulated instructions. |
| |
| .TP |
| .B |
| --pointercheck=<yes|no> [default: yes] |
| When enabled, enforces client address space limits. If this option is |
| disabled, the client program has full and unfettered access to the part |
| of the address space used internally by \fBvalgrind\fP. This can cause |
| unexplained crashes and false error reports, so it is best left enabled. |
| |
| .TP |
| .B |
| --run-libc-freeres=<yes|no> [default: yes] |
| The GNU C library (libc.so), which is used by all programs, may allocate |
| memory for its own uses. Usually it doesn't bother to free that memory when |
| the program ends - there would be no point, since the Linux kernel reclaims |
| all process resources when a process exits anyway, so it would just slow |
| things down. |
| |
| .RS |
| .PP |
| The glibc authors realised that this behaviour causes leak checkers, |
| such as \fBvalgrind\fP, to falsely report leaks in glibc, when a leak |
| check is done at exit. In order to avoid this, they provided a routine |
| called __libc_freeres specifically to make glibc release all memory it |
| has allocated. The MemCheck and AddrCheck tools therefore try and run |
| __libc_freeres at exit. |
| |
| .PP |
| Unfortunately, in some versions of glibc, __libc_freeres is sufficiently |
| buggy to cause segmentation faults. This is particularly noticeable on |
| Red Hat 7.1. So this flag is provided in order to inhibit the run of |
| __libc_freeres. If your program seems to run fine on \fBvalgrind\fP, but |
| segfaults at exit, you may find that --run-libc-freeres=no fixes that, |
| although at the cost of possibly falsely reporting space leaks in libc.so. |
| .RE |
| |
| .TP |
| .B |
| --show-below-main=<yes|no> [default: no] |
| When enabled, this option causes full stack backtraces to be emited, |
| including the part before \fBmain\fP in your program (subject to the |
| \fB--num-callers\fP option.) When disabled, only the part of the stack |
| backtrace up to and including main is printed. |
| |
| .TP |
| .B |
| --single-step=<yes|no> [default: no] |
| When enabled, each x86 insn is translated separately into instrumented |
| code. When disabled, translation is done on a per-basic-block basis, |
| giving much better translations. This is needed when running |
| \fBvalgrind\fP under \fBvalgrind\fP. |
| |
| .TP |
| .B |
| --time-stamp=<yes|no> [default: no] |
| When enabled, a time-stamp is added to all log messages. |
| |
| .TP |
| .B |
| --weird-hacks=hack1,hack2,\.\.\. |
| Pass miscellaneous hints to \fBvalgrind\fP which slightly modify the |
| simulated behaviour in nonstandard or dangerous ways, possibly to help |
| the simulation of strange features. By default no hacks are enabled. Use |
| with caution! Currently known hacks are: |
| |
| .RS |
| .TP |
| .B |
| - lax-ioctls |
| If \fBvalgrind\fP encounters an \fBioctl\fP that it doesn't understand, |
| it normally prints a warning message before continuing. Specifying the |
| lax-ioctls hack tells \fBvalgrind\fP to be very lax about ioctl handling |
| and assume that unknown ioctls just behave correctly. |
| .TP |
| .B |
| - ioctl-mmap |
| Tell \fBvalgrind\fP to search for new memory mappings after an unknown |
| \fBioctl\fP call. |
| .RE |
| |
| .SH CORE DEBUGGING OPTIONS |
| |
| .TP |
| .B |
| --profile=<yes|no> [default: no] |
| When enabled, does crude internal profiling of \fBvalgrind\fP itself. This |
| is not for profiling your programs. Rather it is to allow the developers |
| to assess where \fBvalgrind\fP is spending its time. The tools must be |
| built for profiling for this to work. |
| |
| .TP |
| .B |
| --sanity-level=<number> [default: 1] |
| Set the level of sanity checking to perform. This is used for debugging |
| \fBvalgrind\fP. Setting this to 2 or higher can cause more internal |
| sanity checks to be performed, but can slow your program down |
| appreciably. Setting this to 0 disables sanity checks. |
| |
| .TP |
| .B |
| --trace-codegen=<bitmask> |
| Produce lots of output showing exactly how \fBvalgrind\fP is translating |
| each basic block. The argument to this option is a 5-bit wide bitmask. |
| Each bit refers to a specific feature to trace. If the bit is 1, the |
| feature is traced. If it is 0, the feature is not traced. |
| |
| .RS |
| The traced features are: |
| .TP |
| Bit 1: basic-block disassembly |
| .TP |
| Bit 2: optimization phase |
| .TP |
| Bit 3: tool instrumentation |
| .TP |
| Bit 4: register allocation |
| .TP |
| Bit 5: final code generation |
| .RE |
| |
| .TP |
| .B |
| --trace-malloc=<yes|no> [default: no] |
| Enable or disable tracing of malloc, free and other memory-manager calls. |
| |
| .TP |
| .B |
| --trace-redir=<yes|no> [default: no] |
| Enable or disable tracing of function redirection. |
| |
| .TP |
| .B |
| --trace-sched=<yes|no> [default: no] |
| Enable or disable tracing of thread scheduling events. |
| |
| .TP |
| .B |
| --trace-signals=<yes|no> [default: no] |
| Enable or disable tracing of signal handling. |
| |
| .TP |
| .B |
| --trace-syscalls=<yes|no> [default: no] |
| Enable or disable tracing of system call intercepts. |
| |
| .TP |
| .B |
| --trace-symtab=<yes|no> [default: no] |
| Enable or disable tracing of symbol table reading. |
| |
| .SH SEE ALSO |
| /usr/share/doc/\fBvalgrind\fP/html/manual.html |
| |
| .SH AUTHOR |
| This manpage has been written by Andres Roldan <aroldan@debian.org> |
| for the Debian Project, but can be used for any other distribution. |
| Updated, rearranged and expanded by Robert Walsh <rjwalsh@durables.org> |
| for the 2.4.0 release. |