[augeas-devel] [PATCH 03/16] A simple debugging facility

lutter at redhat.com lutter at redhat.com
Wed Dec 23 21:30:52 UTC 2009


From: David Lutterkort <lutter at redhat.com>

Debugging is disabled by default. When configured with --enable-debug=yes,
Augeas will look at runtime at the environment variable AUGEAS_DEBUG, which
should contain a colon-separated list of categories. Besides printing
various thigs on stdout, some debug output is also left in files in the
directory set by the environment variable AUGEAS_DEBUG_DIR, e.g., dot
graphs of various internal data structures.

  * configure.ac: add --enable-debug option
  * src/internal.h (debugging, debug_file): new functions
  * src/internal.c (debugging, debug_file): new functions
---
 Makefile.maint |    4 ++++
 configure.ac   |    9 +++++++++
 src/internal.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 src/internal.h |   17 +++++++++++++++++
 4 files changed, 77 insertions(+), 0 deletions(-)

diff --git a/Makefile.maint b/Makefile.maint
index cc7e2c5..1e4ec0e 100644
--- a/Makefile.maint
+++ b/Makefile.maint
@@ -28,6 +28,10 @@ upload:
 tag-release:
 	@git tag -s release-$(VERSION)
 
+# Print all the debug categories in use
+debug-categories:
+	@fgrep 'debugging("' src/*.c | sed -r -e 's/^.*debugging\("([^"]+)"\).*$$/\1/' | sort -u
+
 # This is how I run autogen.sh locally
 autogen:
 	./autogen.sh CFLAGS=-g --prefix=/data/share/ --gnulib-srcdir=${HOME}/code/gnulib/ --enable-compile-warnings=error
diff --git a/configure.ac b/configure.ac
index 39d007a..e43b65c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -55,6 +55,15 @@ AC_ARG_WITH([failmalloc],
 
 AM_CONDITIONAL([WITH_FAILMALLOC], [test x$with_failmalloc != xno])
 
+dnl --enable-debug=(yes|no)
+AC_ARG_ENABLE([debug],
+              [AC_HELP_STRING([--enable-debug=no/yes],
+                             [enable debugging output])],[],[enable_debug=yes])
+AM_CONDITIONAL([ENABLE_DEBUG], test x"$enable_debug" = x"yes")
+if test x"$enable_debug" = x"yes"; then
+   AC_DEFINE([ENABLE_DEBUG], [1], [whether debugging is enabled])
+fi
+
 dnl Version info in libtool's notation
 AC_SUBST([LIBAUGEAS_VERSION_INFO], [10:0:10])
 AC_SUBST([LIBFA_VERSION_INFO], [3:0:2])
diff --git a/src/internal.c b/src/internal.c
index 318c79a..77f2fd7 100644
--- a/src/internal.c
+++ b/src/internal.c
@@ -438,6 +438,53 @@ int regexp_c_locale(char **u, size_t *len) {
 }
 #endif
 
+#if ENABLE_DEBUG
+bool debugging(const char *category) {
+    const char *debug = getenv("AUGEAS_DEBUG");
+    const char *s;
+
+    if (debug == NULL)
+        return false;
+
+    for (s = debug; s != NULL; ) {
+        if (STREQLEN(s, category, strlen(category)))
+            return true;
+        s = strchr(s, ':');
+        if (s != NULL)
+            s+=1;
+    }
+    return false;
+}
+
+FILE *debug_fopen(const char *format, ...) {
+    va_list ap;
+    FILE *result = NULL;
+    const char *dir;
+    char *name = NULL, *path = NULL;
+    int r;
+
+    dir = getenv("AUGEAS_DEBUG_DIR");
+    if (dir == NULL)
+        goto error;
+
+    va_start(ap, format);
+    r = vasprintf(&name, format, ap);
+    va_end(ap);
+    if (r < 0)
+        goto error;
+
+    r = xasprintf(&path, "%s/%s", dir, name);
+    if (r < 0)
+        goto error;
+
+    result = fopen(path, "w");
+
+ error:
+    free(name);
+    free(path);
+    return result;
+}
+#endif
 /*
  * Local variables:
  *  indent-tabs-mode: nil
diff --git a/src/internal.h b/src/internal.h
index 732a31e..c3ed984 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -472,6 +472,23 @@ int pathx_symtab_undefine(struct pathx_symtab **symtab, const char *name);
 void pathx_symtab_remove_descendants(struct pathx_symtab *symtab,
                                      const struct tree *tree);
 void free_symtab(struct pathx_symtab *symtab);
+
+/* Debug helpers, all defined in internal.c. When ENABLE_DEBUG is not
+ * set, they compile to nothing.
+ */
+#  if ENABLE_DEBUG
+  /* Return true if debugging for CATEGORY is turned on */
+  bool debugging(const char *category);
+  /* Format the arguments into a file name, prepend it with the directory
+   * from the environment variable AUGEAS_DEBUG_DIR, and open the file for
+   * writing.
+  */
+  FILE *debug_fopen(const char *format, ...)
+    ATTRIBUTE_FORMAT(printf, 1, 2);
+#  else
+#    define debugging(facility) (0)
+#    define debug_fopen(format ...) (NULL)
+#  endif
 #endif
 
 
-- 
1.6.5.2




More information about the augeas-devel mailing list