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 +#endif #include #include #include @@ -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)