[MPlayer-dev-eng] [PATCH] automatic gdb attaching

Reimar Döffinger Reimar.Doeffinger at stud.uni-karlsruhe.de
Sat Oct 23 20:16:06 CEST 2004


Hi,

> > >> Is this okay for everyone?
> > >
> > >Should have brought this up earlier, but could please add a check to
> >
> > configure
> >
> > >that disables it for mingw?
> >
> > I could, but the question is: is this necessary? What happens on MinGW? I
> > had used similar code in another project also under MinGW, the only problem
> > (that I can remember) being that gdb can't do a backtrace from a signal
> > handler (ok, that actually makes it practically useless...).
> 
> I didn't try to compile it on mingw, but possible problems might be
> SIGTRAP - some signal defines seem to be missing on mingw, even if it is there 
> does it get handled?
> getpid(),waitpid(),execlp() - do they exist on mingw?
> fork() doesn't exist for sure.

Ok, modified in the way you suggested originally. Is the attached
version ok now?

Greetings,
Reimar Döffinger
-------------- next part --------------
Index: mplayer.c
===================================================================
RCS file: /cvsroot/mplayer/main/mplayer.c,v
retrieving revision 1.795
diff -u -r1.795 mplayer.c
--- mplayer.c	12 Oct 2004 22:10:54 -0000	1.795
+++ mplayer.c	20 Oct 2004 10:35:47 -0000
@@ -504,8 +504,16 @@
 }
 #endif
 
+#ifdef CRASH_DEBUG
+static char *prog_path;
+static int crash_debug = 0;
+#endif
+
 static void exit_sighandler(int x){
   static int sig_count=0;
+#ifdef CRASH_DEBUG
+  if (!crash_debug || x != SIGTRAP)
+#endif
   ++sig_count;
   if(inited_flags==0 && sig_count>1) exit(1);
   if(sig_count==5)
@@ -527,7 +535,7 @@
   mp_msg(MSGT_CPLAYER,MSGL_FATAL,"\n" MSGTR_IntBySignal,x,
       current_module?current_module:mp_gettext("unknown")
   );
-  if(sig_count==1)
+  if(sig_count<=1)
   switch(x){
   case SIGINT:
   case SIGQUIT:
@@ -545,6 +553,26 @@
       mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGSEGV_SIGFPE);
   default:
       mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGCRASH);
+#ifdef CRASH_DEBUG
+      if (crash_debug) {
+        int gdb_pid;
+        char spid[20];
+        snprintf(spid, 19, "%i", getpid());
+        spid[19] = 0;
+        mp_msg(MSGT_CPLAYER, MSGL_INFO, "Forking...\n");
+        gdb_pid = fork();
+        mp_msg(MSGT_CPLAYER, MSGL_INFO, "Forked...\n");
+        if (gdb_pid == 0) { // We are the child
+          if (execlp("gdb", "gdb", prog_path, spid, NULL) == -1)
+            mp_msg(MSGT_CPLAYER, MSGL_ERR, "Couldn't start gdb\n");
+        } else if (gdb_pid < 0) 
+          mp_msg(MSGT_CPLAYER, MSGL_ERR, "Couldn't fork\n");
+        else {
+          waitpid(gdb_pid, NULL, 0);
+        }
+        if (x == SIGTRAP) return;
+      }
+#endif  
   }
   exit_player(NULL);
 }
@@ -1176,6 +1204,9 @@
   signal(SIGCHLD,child_sighandler);
 #endif
 
+#ifdef CRASH_DEBUG
+  prog_path = argv[0];
+#endif
   //========= Catch terminate signals: ================
   // terminate requests:
   signal(SIGTERM,exit_sighandler); // kill
@@ -1191,6 +1222,10 @@
   signal(SIGILL,exit_sighandler);  // illegal instruction
   signal(SIGFPE,exit_sighandler);  // floating point exc.
   signal(SIGABRT,exit_sighandler); // abort()
+#ifdef CRASH_DEBUG
+  if (crash_debug)
+    signal(SIGTRAP,exit_sighandler);
+#endif
 #endif
 
 #ifdef HAVE_NEW_GUI
Index: cfg-mplayer.h
===================================================================
RCS file: /cvsroot/mplayer/main/cfg-mplayer.h,v
retrieving revision 1.229
diff -u -r1.229 cfg-mplayer.h
--- cfg-mplayer.h	15 Sep 2004 13:37:49 -0000	1.229
+++ cfg-mplayer.h	20 Oct 2004 10:35:47 -0000
@@ -329,6 +329,10 @@
 
 //---------------------- mplayer-only options ------------------------
 
+#ifdef CRASH_DEBUG
+	{"crash-debug", &crash_debug, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
+	{"nocrash-debug", &crash_debug, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL},
+#endif
 	{"osdlevel", &osd_level, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL},
 #ifdef HAVE_MENU
 	{"menu", &use_menu, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
Index: configure
===================================================================
RCS file: /cvsroot/mplayer/main/configure,v
retrieving revision 1.920
diff -u -r1.920 configure
--- configure	17 Oct 2004 13:28:22 -0000	1.920
+++ configure	20 Oct 2004 10:35:47 -0000
@@ -302,6 +302,7 @@
   --enable-debug[=1-3]   compile debugging information into mplayer [disable]
   --enable-profile       compile profiling information into mplayer [disable]
   --disable-sighandler   disable sighandler for crashes [enable]
+  --enable-crash-debug   enable automatic gdb attach on crash [disable]
   --enable-i18n          _experimental_ gnu gettext() support [autodetect]
   --enable-dynamic-plugins  Enable support for dynamic a/v plugins [disable]
 
@@ -1338,6 +1339,7 @@
 _i18n=auto
 _dynamic_plugins=no
 _setlocale=auto
+_crash_debug=auto
 _sighandler=yes
 _libdv=auto
 _cdparanoia=auto
@@ -1677,6 +1679,12 @@
   --disable-debug)
     _debug=
     ;;
+  --enable-crash-debug)
+    _crash_debug=yes
+    ;;
+  --disable-crash-debug)
+    _crash_debug=no
+    ;;
   --enable-sighandler)
     _sighandler=yes
     ;;
@@ -6125,6 +6133,9 @@
   # always compile with '-g' if .developer:
   if test -f ".developer" ; then
     CFLAGS="-g $CFLAGS"
+    if (test "$_crash_debug" = auto) && (not mingw32) ; then
+      _crash_debug=yes
+    fi
     _stripbinaries=no
   fi
 else
@@ -6139,6 +6150,16 @@
 
 EOF
 fi
+
+echocheck "automatic gdb attach"
+if test "$_crash_debug" = yes ; then
+  _def_crash_debug='#define CRASH_DEBUG 1'
+else
+  _def_crash_debug='#undef CRASH_DEBUG'
+  _crash_debug=no
+fi
+echores "$_crash_debug"
+
 if darwin ; then
   CFLAGS="$CFLAGS -DSYS_DARWIN"
   if [ "$_cc_major" = 3 ] && [ "$_cc_minor" -lt 1 ]; then
@@ -6532,6 +6552,9 @@
 /* enable/disable SIGHANDLER */
 $_def_sighandler
 
+/* enable/disable automatic gdb attach on crash, requires SIGHANDLER */
+$_def_crash_debug
+
 /* Toggles debugging informations */
 $_def_debug
 
--- DOCS/man/en/mplayer.1	2004-10-21 18:41:16.000000000 +0200
+++ DOCS/man/en/mplayer.1	2004-10-22 11:55:37.774476998 +0200
@@ -472,6 +472,12 @@
 xover video out drivers.
 .
 .TP
+.B \-crash-debug (DEBUG CODE)
+Automatically attaches gdb upon crash or SIGTRAP.
+Support must be compiled in by configuring with --enable-crash-debug or
+by having a .developer file in the source tree.
+.
+.TP
 .B \-edl <filename> (EDL only)
 Enables edit decision list (EDL) actions during playback.
 Video will be skipped over and audio will be muted and unmuted according to


More information about the MPlayer-dev-eng mailing list