[gtk/matthiasc/for-master: 1/2] reftest: get backtraces
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 1/2] reftest: get backtraces
- Date: Sun, 12 Apr 2020 15:44:53 +0000 (UTC)
commit 7233a70d4760aade780e7743a445da01253f449f
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,
add a backtrace to the messsage 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 | 52 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
---
diff --git a/testsuite/reftests/gtk-reftest.c b/testsuite/reftests/gtk-reftest.c
index c09147a6cc..cf07fcc27f 100644
--- a/testsuite/reftests/gtk-reftest.c
+++ b/testsuite/reftests/gtk-reftest.c
@@ -24,6 +24,9 @@
#include "reftest-module.h"
#include "reftest-snapshot.h"
+#ifndef G_OS_WIN32
+#include <execinfo.h>
+#endif
#include <string.h>
#include <glib/gstdio.h>
#include <gtk/gtk.h>
@@ -384,6 +387,53 @@ 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)
+{
+#ifndef G_OS_WIN32
+ if (log_level & G_LOG_LEVEL_CRITICAL)
+ {
+ void *buffer[1024];
+ int size, i;
+ char **symbols;
+ GString *s;
+ GLogField *my_fields;
+
+ my_fields = g_alloca (sizeof (GLogField) * n_fields);
+
+ s = g_string_new ("");
+
+ size = backtrace (buffer, 1024);
+ symbols = backtrace_symbols (buffer, size);
+ for (i = 0; i < size; i++)
+ {
+ g_string_append (s, symbols[i]);
+ g_string_append_c (s, '\n');
+ }
+ free (symbols);
+
+ for (i = 0; i < n_fields; i++)
+ {
+ my_fields[i] = fields[i];
+
+ if (strcmp (fields[i].key, "MESSAGE") == 0)
+ {
+ my_fields[i].value = g_strconcat (fields[i].value, "\nBacktrace:\n", s->str, NULL);
+ my_fields[i].length = strlen (my_fields[i].value);
+ }
+ }
+ g_string_free (s, TRUE);
+
+ fields = my_fields;
+ }
+#endif
+
+ return g_log_writer_standard_streams (log_level, fields, n_fields, user_data);
+}
+
int
main (int argc, char **argv)
{
@@ -434,6 +484,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]