Here is a patch to force valgrind to dump memory leaks or all
allocations while running. Next we need a patch to filter old
allocations out from new one, leaving recent allocations.
Dunno if it belongs in the source code or not... IIRC we do have #ifdefs
for some external malloc debug stuff already, but I didn't find that
now:-(
Index: servers/slapd/daemon.c
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/daemon.c,v
retrieving revision 1.442
diff -u -2 -r1.442 daemon.c
--- servers/slapd/daemon.c 13 Nov 2009 22:48:51 -0000 1.442
+++ servers/slapd/daemon.c 18 Nov 2009 23:18:29 -0000
@@ -36,4 +36,22 @@
#include <ac/unistd.h>
+#ifdef USE_VALGRIND
+/*
+ * When running under valgrind, make kill -USR1 force a leak/alloc dump
+ * to stderr, in addition to its usual "wake listener" function.
+ * After SIGUSR1 there will also be a dump before shutdown.
+ *
+ * Usage:
+ * valgrind --leak-check=yes --show-reachable=yes slapd -d0 2>slapd.out &
+ * kill -USR1 <slapd or valgrind process>
+ *
+ * For recent leaks/allocs only, do kill -USR1 after startup and again
+ * sometime later. Then filter out from the 2nd dump the occurrences of
+ * allocs from the 1st dump.
+ */
+#include <ac/signal.h>
+#include <valgrind/memcheck.h>
+#endif /* USE_VALGRIND */
+
#include "slap.h"
#include "ldap_pvt_thread.h"
@@ -664,4 +682,25 @@
#endif /* ! epoll && ! /dev/poll */
+#ifdef USE_VALGRIND
+static sig_atomic_t slap_valgrind_requested = 0;
+#define slap_valgrind_request() ((void) (slap_valgrind_requested = 2))
+static void
+slap_valgrind_check( int when, const char *msg )
+{
+ if ( slap_valgrind_requested >= when && RUNNING_ON_VALGRIND ) {
+ Debug( LDAP_DEBUG_TRACE, "Valgrind dump %s\n", msg, 0, 0 );
+ /* Needed for terminator between valgrind -q dumps */
+ VALGRIND_PRINTF( "==> Valgrind dump %s\n", msg );
+ VALGRIND_DO_LEAK_CHECK;
+ VALGRIND_PRINTF( "<== Valgrind dump %s\n", msg );
+ slap_valgrind_requested = 1;
+ }
+}
+
+#else /* !USE_VALGRIND */
+#define slap_valgrind_check(when, msg) ((void) 0)
+#define slap_valgrind_request() ((void) 0)
+#endif /* USE_VALGRIND */
+
#ifdef HAVE_SLP
/*
@@ -2308,4 +2347,6 @@
struct re_s* rtask;
+ slap_valgrind_check( 2, "while running" );
+
now = slap_get_time();
@@ -2760,4 +2801,6 @@
}
+ slap_valgrind_check( 1, "before shutdown" );
+
if ( slapd_gentle_shutdown != 2 ) close_listeners ( 0 );
@@ -2942,4 +2985,6 @@
int save_errno = errno;
+ slap_valgrind_request();
+
WAKE_LISTENER(1);