X-Git-Url: http://nitlanguage.org diff --git a/c_src/nitg.main.1.c b/c_src/nitg.main.1.c index 43c0272..f91014d 100644 --- a/c_src/nitg.main.1.c +++ b/c_src/nitg.main.1.c @@ -1,9 +1,43 @@ #include "nitg.main.0.h" +#include +#define UNW_LOCAL_ONLY +#include int glob_argc; char **glob_argv; val *glob_sys; +void sig_handler(int signo){ +printf("Caught signal : %s\n", strsignal(signo)); +show_backtrace(signo); +} +void show_backtrace (int signo) { +char* opt = getenv("NIT_NO_STACK"); +unw_cursor_t cursor; +if(opt==NULL){ +unw_context_t uc; +unw_word_t ip; +char* procname = malloc(sizeof(char) * 100); +unw_getcontext(&uc); +unw_init_local(&cursor, &uc); +printf("-------------------------------------------------\n"); +printf("-- Stack Trace ------------------------------\n"); +printf("-------------------------------------------------\n"); +while (unw_step(&cursor) > 0) { + unw_get_proc_name(&cursor, procname, 100, &ip); + printf("` %s \n",procname); +} +printf("-------------------------------------------------\n"); +free(procname); +} +exit(signo); +} int main(int argc, char** argv) { val* var /* : Sys */; +signal(SIGABRT, sig_handler); +signal(SIGFPE, sig_handler); +signal(SIGILL, sig_handler); +signal(SIGINT, sig_handler); +signal(SIGTERM, sig_handler); +signal(SIGSEGV, sig_handler); glob_argc = argc; glob_argv = argv; initialize_gc_option(); var = NEW_kernel__Sys(&type_kernel__Sys);