|
From: <mla...@us...> - 2008-01-20 04:24:04
|
Revision: 435
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=435&view=rev
Author: mlampard
Date: 2008-01-19 20:24:09 -0800 (Sat, 19 Jan 2008)
Log Message:
-----------
Retrofit backtrace function to libg15daemon_client to aid debugging any segfaults in client apps on Linux.
Modified Paths:
--------------
trunk/g15daemon-wip/ChangeLog
trunk/g15daemon-wip/configure.in
trunk/g15daemon-wip/libg15daemon_client/g15daemon_net.c
Modified: trunk/g15daemon-wip/ChangeLog
===================================================================
--- trunk/g15daemon-wip/ChangeLog 2008-01-19 15:10:11 UTC (rev 434)
+++ trunk/g15daemon-wip/ChangeLog 2008-01-20 04:24:09 UTC (rev 435)
@@ -153,3 +153,5 @@
- Add example udev helper scripts to contrib directory.
- API: Add NEVER_SELECT cmd to client API to enforce non-display on
client-switch. Used by G15Macro if available.
+- Debug: Add segfault handler to libg15daemon_client to aid debugging
+ clients.
Modified: trunk/g15daemon-wip/configure.in
===================================================================
--- trunk/g15daemon-wip/configure.in 2008-01-19 15:10:11 UTC (rev 434)
+++ trunk/g15daemon-wip/configure.in 2008-01-20 04:24:09 UTC (rev 435)
@@ -36,12 +36,13 @@
AC_PROG_GCC_TRADITIONAL
AC_FUNC_SELECT_ARGTYPES
AC_FUNC_STRFTIME
-AC_CHECK_FUNCS([memset select socket strerror])
+AC_CHECK_FUNCS([memset select socket strerror backtrace backtrace_symbols])
# Checks for header files.
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([ linux/input.h ])
+AC_CHECK_HEADERS([ execinfo.h ])
AC_CHECK_HEADERS([ linux/uinput.h ], [have_linux_uinput_h=yes],[have_linux_uinput_h=],[])
AC_CHECK_HEADERS([ arpa/inet.h fcntl.h stdlib.h string.h sys/socket.h unistd.h libg15.h],,,
[#if HAVE_LINUX_INPUT_H
Modified: trunk/g15daemon-wip/libg15daemon_client/g15daemon_net.c
===================================================================
--- trunk/g15daemon-wip/libg15daemon_client/g15daemon_net.c 2008-01-19 15:10:11 UTC (rev 434)
+++ trunk/g15daemon-wip/libg15daemon_client/g15daemon_net.c 2008-01-20 04:24:09 UTC (rev 435)
@@ -33,6 +33,7 @@
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <stdio.h>
#include <config.h>
@@ -51,14 +52,60 @@
return VERSION;
}
+#ifdef HAVE_BACKTRACE
+
+#include <signal.h>
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+#define BACKTRACE_LEN 100
+_Bool segv_init = 0;
+
+/* sighandler function to print backtrace on segfault */
+
+void g15_sighandler(int sig) {
+ int i,nptrs;
+ void *buf[BACKTRACE_LEN];
+ char **btfuncs;
+
+ switch (sig) {
+ case SIGSEGV:
+ #ifdef HAVE_EXECINFO_H
+ fprintf(stderr, "The application caught a Segmentation Fault. Backtrace follows:\n");
+ nptrs = backtrace(buf,BACKTRACE_LEN);
+
+ btfuncs = backtrace_symbols(buf,nptrs);
+ if(btfuncs == NULL)
+ return;
+
+ for(i=0;i<nptrs;i++)
+ fprintf(stderr,"Backtrace: %s\n",btfuncs[i]);
+
+ free(btfuncs);
+ #endif
+ break;
+ }
+}
+#endif
+
int new_g15_screen(int screentype)
{
+ struct sigaction new_sigaction;
int g15screen_fd;
struct sockaddr_in serv_addr;
+ static int sighandler_init=0;
/* raise the priority of our packets */
int tos = 0x6;
char buffer[256];
+ if(sighandler_init==0) {
+#ifdef HAVE_BACKTRACE
+ new_sigaction.sa_handler = g15_sighandler;
+ new_sigaction.sa_flags = 0;
+ sigaction(SIGSEGV,&new_sigaction,NULL);
+#endif
+ sighandler_init=1;
+ }
g15screen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (g15screen_fd < 0)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|