[gtk/matthiasc/for-master] reftest: get backtraces



commit 99c062d324271724be0dd9a2fc1c36fb32530626
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Apr 12 10:40:07 2020 -0400

    reftest: get backtraces
    
    In the hope of making ci-only failures less of
    a black hole, print a backtrace for criticals.
    
    This could eventually go into GLib (pass backtrace
    symbols along as a log field for criticals), but
    for now this will do.

 testsuite/reftests/gtk-reftest.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
---
diff --git a/testsuite/reftests/gtk-reftest.c b/testsuite/reftests/gtk-reftest.c
index c09147a6cc..2e95e9d52f 100644
--- a/testsuite/reftests/gtk-reftest.c
+++ b/testsuite/reftests/gtk-reftest.c
@@ -24,6 +24,7 @@
 #include "reftest-module.h"
 #include "reftest-snapshot.h"
 
+#include <execinfo.h>
 #include <string.h>
 #include <glib/gstdio.h>
 #include <gtk/gtk.h>
@@ -384,6 +385,28 @@ add_test_for_file (GFile *file)
   g_list_free_full (files, g_object_unref);
 }
 
+static GLogWriterOutput
+log_writer (GLogLevelFlags   log_level,
+            const GLogField *fields,
+            gsize            n_fields,
+            gpointer         user_data)
+{
+  if (log_level & G_LOG_LEVEL_CRITICAL)
+    {
+      void *buffer[1024];
+      int size, i;
+      char **symbols;
+
+      size = backtrace (buffer, 1024);
+      symbols = backtrace_symbols (buffer, size);
+      for (i = 0; i < size; i++)
+        g_print ("%s\n", symbols[i]);
+      free (symbols);
+    }
+
+  return g_log_writer_standard_streams (log_level, fields, n_fields, user_data);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -434,6 +457,8 @@ main (int argc, char **argv)
    */
   chdir (basedir);
 
+  g_log_set_writer_func (log_writer, NULL, NULL);
+
   result = g_test_run ();
 
   if (using_tap)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]