From 735cc1af7595890d9cd567f36dabaf41fae4210e Mon Sep 17 00:00:00 2001 From: Mamoru TASAKA 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 #include #include #include +#ifdef __GNU_LIBRARY__ +#include +#endif + #ifdef ENABLE_NLS # include # include @@ -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