diff --git a/event.c b/event.c index 8189dd15..5d3a5512 100644 --- a/event.c +++ b/event.c @@ -403,7 +403,8 @@ int event_queue_wait_multi(int eq, int timeout, void *events, int nevents) { } if (ret < 0) { - uwsgi_error("kevent()"); + if (errno != EINTR) + uwsgi_error("kevent()"); } return ret; @@ -443,7 +444,8 @@ int event_queue_wait(int eq, int timeout, int *interesting_fd) { } if (ret < 0) { - uwsgi_error("kevent()"); + if (errno != EINTR) + uwsgi_error("kevent()"); } if (ret > 0) { diff --git a/uwsgi.c b/uwsgi.c index 45065eff..c1753ebb 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -49,6 +49,7 @@ static struct uwsgi_option uwsgi_base_options[] = { {"harakiri-no-arh", no_argument, 0, "do not enable harakiri during after-request-hook", uwsgi_opt_true, &uwsgi.harakiri_no_arh,0}, {"no-harakiri-arh", no_argument, 0, "do not enable harakiri during after-request-hook", uwsgi_opt_true, &uwsgi.harakiri_no_arh,0}, {"no-harakiri-after-req-hook", no_argument, 0, "do not enable harakiri during after-request-hook", uwsgi_opt_true, &uwsgi.harakiri_no_arh,0}, + {"backtrace-depth", no_argument, 0, "set backtrace depth", uwsgi_opt_set_int, &uwsgi.backtrace_depth, 0}, {"spooler-harakiri", required_argument, 0, "set harakiri timeout for spooler tasks", uwsgi_opt_set_dyn, (void *) UWSGI_OPTION_SPOOLER_HARAKIRI,0}, {"mule-harakiri", required_argument, 0, "set harakiri timeout for mule tasks", uwsgi_opt_set_dyn, (void *) UWSGI_OPTION_MULE_HARAKIRI,0}, #ifdef UWSGI_XML @@ -799,6 +800,8 @@ void what_i_am_doing() { struct wsgi_request *wsgi_req; int i; + uwsgi_backtrace(uwsgi.backtrace_depth); + if (uwsgi.cores > 1) { for (i = 0; i < uwsgi.cores; i++) { wsgi_req = uwsgi.wsgi_requests[i]; @@ -1027,37 +1030,45 @@ void uwsgi_plugins_atexit(void) { } -#ifdef __linux__ +void uwsgi_backtrace(int depth) { + +#if defined(__linux__) || defined(__APPLE__) #include -void uwsgi_backtrace(int signum) { - - void *btrace[64]; + void **btrace = uwsgi_malloc(sizeof(void *) * depth); size_t bt_size, i; char **bt_strings; - uwsgi_log("!!! uWSGI process %d got Segmentation Fault !!!\n", (int) getpid()); - - bt_size = backtrace(btrace, 64); + bt_size = backtrace(btrace, depth); bt_strings = backtrace_symbols(btrace, bt_size); - uwsgi_log("*** backtrace ***\n"); + uwsgi_log("*** backtrace of %d ***\n", (int) getpid()); for(i=0;i