]> granicus.if.org Git - p11-kit/commitdiff
Add support for debug tracing.
authorStef Walter <stefw@collabora.co.uk>
Tue, 5 Apr 2011 15:19:09 +0000 (17:19 +0200)
committerStef Walter <stefw@collabora.co.uk>
Tue, 5 Apr 2011 15:19:09 +0000 (17:19 +0200)
Use P11_KIT_DEBUG=xxx environment variable to enable tracing. Must
have been built without --disable-debug option.

P11_KIT_DEBUG can (at this point) be one of these values:
 all
 help
 conf
 lib

.gitignore
configure.ac
doc/Makefile.am
p11-kit/Makefile.am
p11-kit/conf.c
p11-kit/debug.c [new file with mode: 0644]
p11-kit/debug.h [new file with mode: 0644]
p11-kit/p11-kit-lib.c

index f2047de28c9edd13edf555d63faf6675b2e66664..2a16de92bc6be8515c71fd6828a47ace2dc527b6 100644 (file)
@@ -1,6 +1,7 @@
 *.o
 *.la
 *.lo
+*.bak
 *.tar.gz
 *.gcno
 *.gcda
index a10790b88cd379c845eb8995e7ff7d3bc1f9bd4b..2892c70cd8b1b9523c5f59b788f92b6f9bec6726 100644 (file)
@@ -124,15 +124,26 @@ AC_SUBST(GENHTML)
 # Debug mode
 
 AC_ARG_ENABLE(debug,
-              AC_HELP_STRING([--enable-debug],
-              [Compile binaries in debug mode]))
+              AC_HELP_STRING([--enable-debug=no/yes/full],
+              [Turn on or off debugging]))
 
-if test "$enable_debug" = "yes"; then
-       CFLAGS="$CFLAGS -g -O0"
-       AC_DEFINE_UNQUOTED(_DEBUG, 1, [In debug mode])
-       echo "enabling debug compile mode"
+if test "$enable_debug" != "no"; then
+       AC_DEFINE_UNQUOTED(WITH_DEBUG, 1, [Print debug output])
 fi
 
+if test "$enable_debug" = "full"; then
+       debug_status="full"
+       CFLAGS="$CFLAGS -g -O0 -Werror"
+
+elif test "$enable_debug" = "no"; then
+       debug_status="no"
+       AC_DEFINE_UNQUOTED(NDEBUG, 1, [Disable glib assertions])
+
+else
+       debug_status="yes"
+fi
+
+
 # ---------------------------------------------------------------------
 
 AC_CONFIG_FILES([Makefile
index fe65836205c13c52184aa528ece5f7d4c3309b73..4672b202ef34260c87541214a9304f6e4629aeb1 100644 (file)
@@ -42,7 +42,7 @@ CFILE_GLOB=$(top_srcdir)/p11-kit/p11-kit-*.c
 
 # Header files to ignore when scanning.
 # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
-IGNORE_HFILES= p11-kit-private.h pkcs11.h hash.h conf.h util.h
+IGNORE_HFILES= p11-kit-private.h pkcs11.h conf.h debug.h hash.h util.h
 
 # Images to copy into HTML directory.
 # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
index a5a9195a65a87f56fdeff39907cce951ab25e64b..0b7e1632bc4f0bf976d123d32ea55b0d46724164 100644 (file)
@@ -11,6 +11,7 @@ inc_HEADERS = \
 
 MODULE_SRCS = \
        conf.c conf.h \
+       debug.c debug.h \
        hash.c hash.h \
        util.c util.h \
        p11-kit-lib.c \
index de42745f035a2a4709841bf9168d59ae6af40de5..7523f98b85dc7982b21436cf7f3ab4c6ca6a0043 100644 (file)
@@ -38,6 +38,8 @@
 #include "config.h"
 
 #include "conf.h"
+#define DEBUG_FLAG DEBUG_CONF
+#include "debug.h"
 
 #include <sys/param.h>
 #include <sys/stat.h>
@@ -182,6 +184,8 @@ conf_parse_file (const char* filename, int flags,
 
        assert (filename);
 
+       debug ("reading config file: %s", filename);
+
        /* Adds an extra newline to end of file */
        config = read_config_file (filename, flags, error_func);
        if (!config)
@@ -226,6 +230,9 @@ conf_parse_file (const char* filename, int flags,
                        errno = ENOMEM;
                        break;
                }
+
+               debug ("config value: %s = %s", name, value);
+
                if (!hash_set (ht, name, value)) {
                        free (name);
                        free (value);
diff --git a/p11-kit/debug.c b/p11-kit/debug.c
new file mode 100644 (file)
index 0000000..a7b75ad
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2011 Collabora Ltd.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *     * Redistributions of source code must retain the above
+ *       copyright notice, this list of conditions and the
+ *       following disclaimer.
+ *     * Redistributions in binary form must reproduce the
+ *       above copyright notice, this list of conditions and
+ *       the following disclaimer in the documentation and/or
+ *       other materials provided with the distribution.
+ *     * The names of contributors to this software may not be
+ *       used to endorse or promote products derived from this
+ *       software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ *
+ * CONTRIBUTORS
+ *  Stef Walter <stef@memberwebs.com>
+ */
+
+#include "config.h"
+
+#include "debug.h"
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+struct DebugKey {
+       const char *name;
+       int value;
+};
+
+static struct DebugKey debug_keys[] = {
+       { "lib", DEBUG_LIB },
+       { "conf", DEBUG_CONF },
+       { 0, }
+};
+
+pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* global variable exported in debug.h */
+int debug_current_flags = ~0;
+
+static int
+parse_environ_flags (void)
+{
+       const char *env;
+       int result = 0;
+       const char *p;
+       const char *q;
+       int i;
+
+       env = getenv ("P11_KIT_DEBUG");
+       if (!env)
+               return 0;
+
+       if (strcmp (env, "all") == 0) {
+               for (i = 0; debug_keys[i].name; i++)
+                       result |= debug_keys[i].value;
+
+       } else if (strcmp (env, "help") == 0) {
+               fprintf (stderr, "Supported debug values:");
+               for (i = 0; debug_keys[i].name; i++)
+                       fprintf (stderr, " %s", debug_keys[i].name);
+               fprintf (stderr, "\n");
+
+       } else {
+               p = env;
+               while (*p) {
+                       q = strpbrk (p, ":;, \t");
+                       if (!q)
+                               q = p + strlen (p);
+
+                       for (i = 0; debug_keys[i].name; i++) {
+                               if (q - p == strlen (debug_keys[i].name) &&
+                                   strncmp (debug_keys[i].name, p, q - p) == 0)
+                                       result |= debug_keys[i].value;
+                       }
+
+                       p = q;
+                       if (*p)
+                               p++;
+               }
+       }
+
+       return result;
+}
+
+void
+debug_message (int flag, const char *format, ...)
+{
+       static int initialized_flags = 0;
+       char buffer[512];
+       va_list args;
+
+       pthread_mutex_lock (&debug_mutex);
+
+       /*
+        * This is not thread-safe, but it's not really the end of the
+        * world if it happens more than once.
+        */
+       if (!initialized_flags) {
+               initialized_flags = 1;
+               debug_current_flags = parse_environ_flags ();
+       }
+
+       if (flag & debug_current_flags) {
+               va_start (args, format);
+               vsnprintf (buffer, sizeof (buffer), format, args);
+               buffer[sizeof (buffer) -1] = 0;
+               va_end (args);
+               fprintf (stderr, "(p11-kit:%d) %s\n", getpid(), buffer);
+       }
+
+       pthread_mutex_unlock (&debug_mutex);
+}
diff --git a/p11-kit/debug.h b/p11-kit/debug.h
new file mode 100644 (file)
index 0000000..5d244f3
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2011 Collabora Ltd.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *     * Redistributions of source code must retain the above
+ *       copyright notice, this list of conditions and the
+ *       following disclaimer.
+ *     * Redistributions in binary form must reproduce the
+ *       above copyright notice, this list of conditions and
+ *       the following disclaimer in the documentation and/or
+ *       other materials provided with the distribution.
+ *     * The names of contributors to this software may not be
+ *       used to endorse or promote products derived from this
+ *       software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Author: Stef Walter <stefw@collabora.co.uk>
+ */
+
+#ifndef DEBUG_H
+#define DEBUG_H
+
+/* Please keep this enum in sync with keys in debug.c */
+typedef enum {
+       DEBUG_LIB = 1 << 1,
+       DEBUG_CONF = 1 << 2
+} DebugFlags;
+
+extern int        debug_current_flags;
+
+void              debug_message                  (int flag,
+                                                  const char *format,
+                                                  ...);
+
+#endif /* DEBUG_H */
+
+/* -----------------------------------------------------------------------------
+ * Below this point is outside the DEBUG_H guard - so it can take effect
+ * more than once. So you can do:
+ *
+ * #define DEBUG_FLAG DEBUG_ONE_THING
+ * #include "gkr-debug.h"
+ * ...
+ * DEBUG ("if we're debugging one thing");
+ * ...
+ * #undef DEBUG_FLAG
+ * #define DEBUG_FLAG DEBUG_OTHER_THING
+ * #include "gkr-debug.h"
+ * ...
+ * DEBUG ("if we're debugging the other thing");
+ * ...
+ */
+
+#ifdef DEBUG_FLAG
+#ifdef WITH_DEBUG
+
+#undef debug
+#define debug(format, ...) do { \
+       if (DEBUG_FLAG & debug_current_flags) \
+               debug_message (DEBUG_FLAG, "%s: " format, __PRETTY_FUNCTION__, ##__VA_ARGS__); \
+       } while (0)
+
+#undef debugging
+#define debugging \
+       (DEBUG_FLAG & debug_current_flags)
+
+#else /* !defined (WITH_DEBUG) */
+
+#undef debug
+#define debug(format, ...) \
+       do {} while (0)
+
+#undef debugging
+#define debugging 0
+
+#endif /* !defined (WITH_DEBUG) */
+
+#endif /* defined (DEBUG_FLAG) */
index 7bd70e3148697ed05149ecdf464fe50d69c22209..561df471fc581589fad7932dfe826c2ee666fa5d 100644 (file)
@@ -36,6 +36,8 @@
 #include "config.h"
 
 #include "conf.h"
+#define DEBUG_FLAG DEBUG_LIB
+#include "debug.h"
 #include "hash.h"
 #include "pkcs11.h"
 #include "p11-kit.h"
@@ -633,6 +635,7 @@ reinitialize_after_fork (void)
        Module *module;
 
        /* WARNING: This function must be reentrant */
+       debug ("forked");
 
        _p11_lock ();
 
@@ -742,7 +745,7 @@ find_module_for_name_unlocked (const char *name)
 
        hash_iterate (gl.modules, &it);
        while (hash_next (&it, NULL, (void**)&module))
-               if (module->ref_count && module->name && strcmp (name, module->name))
+               if (module->ref_count && module->name && strcmp (name, module->name) == 0)
                        return module;
        return NULL;
 }
@@ -795,6 +798,7 @@ p11_kit_initialize_registered (void)
        CK_RV rv;
 
        /* WARNING: This function must be reentrant */
+       debug ("in");
 
        _p11_lock ();
 
@@ -807,6 +811,7 @@ p11_kit_initialize_registered (void)
        if (rv != CKR_OK)
                p11_kit_finalize_registered ();
 
+       debug ("out: %lu");
        return rv;
 }
 
@@ -836,6 +841,8 @@ _p11_kit_finalize_registered_unlocked_reentrant (void)
                        to_finalize[count++] = module;
        }
 
+       debug ("finalizing %d modules", count);
+
        for (i = 0; i < count; ++i) {
                /* WARNING: Reentrant calls can occur here */
                finalize_module_unlocked_reentrant (to_finalize[i]);
@@ -864,6 +871,7 @@ p11_kit_finalize_registered (void)
        CK_RV rv;
 
        /* WARNING: This function must be reentrant */
+       debug ("in");
 
        _p11_lock ();
 
@@ -872,6 +880,7 @@ p11_kit_finalize_registered (void)
 
        _p11_unlock ();
 
+       debug ("out: %lu", rv);
        return rv;
 }
 
@@ -1063,6 +1072,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
        CK_RV rv = CKR_OK;
 
        /* WARNING: This function must be reentrant for the same arguments */
+       debug ("in");
 
        _p11_lock ();
 
@@ -1071,6 +1081,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
 
                        module = hash_get (gl.modules, funcs);
                        if (module == NULL) {
+                               debug ("allocating new module");
                                allocated = module = alloc_module_unlocked ();
                                module->funcs = funcs;
                        }
@@ -1089,6 +1100,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
 
        _p11_unlock ();
 
+       debug ("out: %lu", rv);
        return rv;
 }
 
@@ -1120,11 +1132,13 @@ p11_kit_finalize_module (CK_FUNCTION_LIST_PTR funcs)
        CK_RV rv = CKR_OK;
 
        /* WARNING: This function must be reentrant for the same arguments */
+       debug ("in");
 
        _p11_lock ();
 
                module = gl.modules ? hash_get (gl.modules, funcs) : NULL;
                if (module == NULL) {
+                       debug ("module not found");
                        rv = CKR_ARGUMENTS_BAD;
                } else {
                        /* WARNING: Rentrancy can occur here */
@@ -1133,5 +1147,6 @@ p11_kit_finalize_module (CK_FUNCTION_LIST_PTR funcs)
 
        _p11_unlock ();
 
+       debug ("out: %lu", rv);
        return rv;
 }