peer: Add core dumping and backtrace in segfaults
[archipelago] / xseg / sys / user / xseg_user.c
index f84bc66..8e1d1b7 100644 (file)
@@ -184,7 +184,7 @@ int __init_logctx(struct log_ctx *lc, char *peer_name,
 
        /* set logfile to stderr by default */
        lc->logfile = STDERR_FILENO;
-
+#if 0
        /* duplicate stdout, stderr */
        fd = dup(STDOUT_FILENO);
        if (fd < 0){
@@ -197,10 +197,10 @@ int __init_logctx(struct log_ctx *lc, char *peer_name,
                return -1;
        }
        lc->stderr_orig = fd;
-
+#endif
        lc->log_level = log_level;
        if (!logfile || !logfile[0]) {
-               lc->logfile = lc->stderr_orig;
+//             lc->logfile = lc->stderr_orig;
                return 0;
        }
 
@@ -208,7 +208,7 @@ int __init_logctx(struct log_ctx *lc, char *peer_name,
        lc->filename[MAX_LOGFILE_LEN - 1] = 0;
        fd = open(lc->filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);
        if (fd < 1){
-               lc->logfile = lc->stderr_orig;
+//             lc->logfile = lc->stderr_orig;
                return -1;
        }
        lc->logfile = fd;
@@ -275,31 +275,29 @@ void __xseg_log2(struct log_ctx *lc, enum log_level level, char *fmt, ...)
                if (r < 0){
                        if (errno == EBADF)
                                fd = *(volatile int *)&lc->logfile;
-                       else
+                       else {
                                //XSEGLOG("Error while writing log");
                                break;
+                       }
+               } else {
+                       sum += r;
                }
-               sum += r;
        } while (sum < count);
+       /* No need to check for error */
+       //fsync(fd);
        va_end(ap);
 
        return;
 }
 
+/* FIXME: This is not async safe */
 void xseg_printtrace(void)
 {
-       void *array[10];
+       void *array[20];
        size_t size;
-       char **strings;
-       int i;
-
-       size = backtrace (array, 10);
-       strings = backtrace_symbols (array, size);
-
-       XSEGLOG("Obtained %zd stack frames.\n", size);
-
-       for (i = 0; i < size; i++)
-               XSEGLOG ("%s\n", strings[i]);
 
-       free (strings);
+       XSEGLOG("Backtrace:");
+       size = backtrace(array, 20);
+       /* stderr should be open since we don't close it */
+       backtrace_symbols_fd(array, size, 2);
 }