ported backtrace to osx

This commit is contained in:
roberto@goyle
2012-02-06 11:38:56 +01:00
parent d2cbb7eea2
commit 0d4f6501b0
3 changed files with 32 additions and 15 deletions
+4 -2
View File
@@ -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) {
+24 -13
View File
@@ -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 <execinfo.h>
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<bt_size;i++) {
uwsgi_log("%s\n", bt_strings[i]);
}
free(btrace);
uwsgi_log("*** end of backtrace ***\n");
#endif
}
void uwsgi_segfault(int signum) {
uwsgi_log("!!! uWSGI process %d got Segmentation Fault !!!\n", (int) getpid());
uwsgi_backtrace(uwsgi.backtrace_depth);
// restore default handler to generate core
signal(signum, SIG_DFL);
kill(getpid(), signum);
// never here...
exit(1);
}
#endif
#ifdef UWSGI_AS_SHARED_LIBRARY
@@ -1095,9 +1106,7 @@ int main(int argc, char *argv[], char *envp[]) {
char *emperor_env;
//char *optname;
#ifdef __linux__
signal(SIGSEGV, uwsgi_backtrace);
#endif
signal(SIGSEGV, uwsgi_segfault);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
@@ -1145,6 +1154,8 @@ int main(int argc, char *argv[], char *envp[]) {
uwsgi.p[i] = &unconfigured_plugin;
}
uwsgi.backtrace_depth = 64;
uwsgi.master_queue = -1;
uwsgi.signal_socket = -1;
+4
View File
@@ -1245,6 +1245,8 @@ struct uwsgi_server {
char *pidfile;
char *pidfile2;
int backtrace_depth;
int harakiri_verbose;
int harakiri_no_arh;
@@ -2562,6 +2564,8 @@ void uwsgi_opt_add_route(char *, char *, void *);
int uwsgi_apply_routes(struct wsgi_request *);
#endif
void uwsgi_backtrace(int);
#ifdef UWSGI_AS_SHARED_LIBRARY
int uwsgi_init(int, char **, char **);
#endif