You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
1.8 KiB

From 735cc1af7595890d9cd567f36dabaf41fae4210e Mon Sep 17 00:00:00 2001
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
Date: Mon, 11 Jul 2016 16:53:14 +0900
Subject: [PATCH] XIO: print C backtrace on error
For debugging purpose, show C backtrace with XIO
error happens.
---
driver/xscreensaver.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
index 76969f2..04c2669 100644
--- a/driver/xscreensaver.c
+++ b/driver/xscreensaver.c
@@ -148,10 +148,15 @@
# include "config.h"
#endif
+#include <features.h>
#include <stdio.h>
#include <ctype.h>
#include <X11/Xlib.h>
+#ifdef __GNU_LIBRARY__
+#include <execinfo.h>
+#endif
+
#ifdef ENABLE_NLS
# include <locale.h>
# include <libintl.h>
@@ -504,6 +509,41 @@ startup_ehandler (String name, String type, String class,
exit (1);
}
+static void
+show_cstyle_backtrace(void)
+{
+#ifdef __GNU_LIBRARY__
+ void *bt_array[128];
+ size_t bt_size;
+
+ bt_size = backtrace(bt_array, countof(bt_array));
+ fprintf(stderr, "C backtrace:\n");
+ backtrace_symbols_fd(bt_array, bt_size, STDERR_FILENO);
+#endif
+}
+
+static int (*default_xio_ehandler)(Display *dpy) = 0;
+
+static int
+show_debug_info_xio_ehandler(Display *dpy)
+{
+ show_cstyle_backtrace();
+ if (default_xio_ehandler){
+ (*default_xio_ehandler)(dpy);
+ }
+ return 0;
+}
+
+static void
+hack_IOErrorHandler(void)
+{
+#ifdef __GNU_LIBRARY__
+ XIOErrorHandler old_handler;
+ old_handler = XSetIOErrorHandler(show_debug_info_xio_ehandler);
+ default_xio_ehandler = old_handler;
+#endif
+}
+
/* The zillions of initializations.
*/
@@ -1570,6 +1610,7 @@ main (int argc, char **argv)
initialize_stderr (si);
handle_signals (si);
+ hack_IOErrorHandler();
make_splash_dialog (si);
--
2.7.4