85 lines
1.8 KiB
Diff
85 lines
1.8 KiB
Diff
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
|
||
|