From: Renaud Métrich <rmetr...@redhat.com>

Debug traces with timestamps are useful to detect performance
issues. To enable it, include '--with-debug-timestamps' argument on
the configure step.

Signed-off-by: Renaud Métrich <rmetr...@redhat.com>
Signed-off-by: Leo Sandoval <lsand...@redhat.com>
---
 config.h.in           |  1 +
 configure.ac          | 18 ++++++++++++++++++
 grub-core/kern/misc.c | 21 +++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/config.h.in b/config.h.in
index 9b1d399718..e0e27a8a6a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -16,6 +16,7 @@
 /* Define to 1 to enable disk cache statistics.  */
 #define DISK_CACHE_STATS @DISK_CACHE_STATS@
 #define BOOT_TIME_STATS @BOOT_TIME_STATS@
+#define DEBUG_WITH_TIMESTAMPS @DEBUG_WITH_TIMESTAMPS@
 
 /* We don't need those.  */
 #define MINILZO_CFG_SKIP_LZO_PTR 1
diff --git a/configure.ac b/configure.ac
index 83e3ddf908..34fb9a01ad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1657,6 +1657,17 @@ else
 fi
 AC_SUBST([BOOT_TIME_STATS])
 
+AC_ARG_WITH([debug-timestamps],
+          AS_HELP_STRING([--with-debug-timestamps],
+                          [prepend debug traces with absolute and relative 
timestamps]))
+
+if test x$with_debug_timestamps = xyes; then
+  DEBUG_WITH_TIMESTAMPS=1
+else
+  DEBUG_WITH_TIMESTAMPS=0
+fi
+AC_SUBST([DEBUG_WITH_TIMESTAMPS])
+
 AC_ARG_ENABLE([grub-emu-sdl2],
              [AS_HELP_STRING([--enable-grub-emu-sdl2],
                              [build and install the `grub-emu' debugging 
utility with SDL2 support (default=guessed)])])
@@ -2245,6 +2256,7 @@ AM_CONDITIONAL([COND_APPLE_LINKER], [test 
x$TARGET_APPLE_LINKER = x1])
 AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
 AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
 AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
+AM_CONDITIONAL([COND_DEBUG_WITH_TIMESTAMPS], [test x$DEBUG_WITH_TIMESTAMPS = 
x1])
 
 AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
 
@@ -2346,6 +2358,12 @@ else
 echo With boot time statistics: No
 fi
 
+if [ x"$with_debug_timestamps" = xyes ]; then
+echo Debug traces with timestamps: Yes
+else
+echo Debug traces with timestamps: No
+fi
+
 if [ x"$efiemu_excuse" = x ]; then
 echo efiemu runtime: Yes
 else
diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
index 90c71d7cea..967c01588d 100644
--- a/grub-core/kern/misc.c
+++ b/grub-core/kern/misc.c
@@ -26,6 +26,9 @@
 #include <grub/i18n.h>
 #include <grub/types.h>
 #include <grub/charset.h>
+#if DEBUG_WITH_TIMESTAMPS
+#include <grub/time.h>
+#endif
 
 union printf_arg
 {
@@ -235,9 +238,27 @@ grub_real_dprintf (const char *file, const char *function, 
const int line, const
                   const char *fmt, ...)
 {
   va_list args;
+#if DEBUG_WITH_TIMESTAMPS
+  static long unsigned int last_time = 0;
+  static int last_had_cr = 1;
+#endif
 
   if (grub_debug_enabled (condition))
     {
+#if DEBUG_WITH_TIMESTAMPS
+      /* Don't print timestamp if last printed message isn't terminated yet */
+      if (last_had_cr) {
+        long unsigned int tmabs = (long unsigned int) grub_get_time_ms();
+        long unsigned int tmrel = tmabs - last_time;
+        last_time = tmabs;
+        grub_printf ("%3lu.%03lus:%2lu.%03lus:", tmabs / 1000, tmabs % 1000, 
tmrel / 1000, tmrel % 1000);
+      }
+      if (fmt[grub_strlen(fmt)-1] == '\n')
+        last_had_cr = 1;
+      else
+        last_had_cr = 0;
+#endif
+
       grub_printf ("%s:%s:%d:%s: ", file, function, line, condition);
       va_start (args, fmt);
       grub_vprintf (fmt, args);
-- 
2.48.1


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to