瀏覽代碼

display stack trace on signals TERM/SEGV

ncannasse 6 年之前
父節點
當前提交
9c44cde7f4
共有 1 個文件被更改,包括 23 次插入0 次删除
  1. 23 0
      src/main.c

+ 23 - 0
src/main.c

@@ -73,6 +73,28 @@ __declspec(dllexport) DWORD NvOptimusEnablement = 1;
 __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
 __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
 #endif
 #endif
 
 
+#if defined(HL_LINUX) || defined(HL_OSX)
+#include <signal.h>
+static void handle_signal( int signum ) {
+	signal(signum, SIG_DFL);
+	printf("SIGNAL %d\n",signum);
+	hl_dump_stack();
+	raise(signum);
+}
+static void setup_handler() {
+	struct sigaction act;
+	act.sa_sigaction = NULL;
+	act.sa_handler = handle_signal;
+	act.sa_flags = 0;
+	sigemptyset(&act.sa_mask);
+	sigaction(SIGSEGV,&act,NULL);
+	sigaction(SIGTERM,&act,NULL);
+}
+#else
+static void setup_handler() {
+}
+#endif
+
 #ifdef HL_WIN
 #ifdef HL_WIN
 int wmain(int argc, pchar *argv[]) {
 int wmain(int argc, pchar *argv[]) {
 #else
 #else
@@ -153,6 +175,7 @@ int main(int argc, pchar *argv[]) {
 	ctx.c.t = ctx.code->functions[ctx.m->functions_indexes[ctx.m->code->entrypoint]].type;
 	ctx.c.t = ctx.code->functions[ctx.m->functions_indexes[ctx.m->code->entrypoint]].type;
 	ctx.c.fun = ctx.m->functions_ptrs[ctx.m->code->entrypoint];
 	ctx.c.fun = ctx.m->functions_ptrs[ctx.m->code->entrypoint];
 	ctx.c.hasValue = 0;
 	ctx.c.hasValue = 0;
+	setup_handler();
 	ctx.ret = hl_dyn_call_safe(&ctx.c,NULL,0,&isExc);
 	ctx.ret = hl_dyn_call_safe(&ctx.c,NULL,0,&isExc);
 	if( isExc ) {
 	if( isExc ) {
 		varray *a = hl_exception_stack();
 		varray *a = hl_exception_stack();