Sfoglia il codice sorgente

catch stack overflows and other low level exceptions

Nicolas Cannasse 9 anni fa
parent
commit
9702f7139a
5 ha cambiato i file con 35 aggiunte e 27 eliminazioni
  1. 0 4
      hl.vcxproj
  2. 0 4
      hlc.vcxproj
  3. 0 4
      src/hl.h
  4. 17 7
      src/hlc_main.c
  5. 18 8
      src/main.c

+ 0 - 4
hl.vcxproj

@@ -100,7 +100,6 @@
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
-      <StackReserveSize>0x400000,0x400000</StackReserveSize>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>false</DataExecutionPrevention>
       <DataExecutionPrevention>false</DataExecutionPrevention>
     </Link>
     </Link>
@@ -118,7 +117,6 @@
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
-      <StackReserveSize>0x400000</StackReserveSize>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>false</DataExecutionPrevention>
       <DataExecutionPrevention>false</DataExecutionPrevention>
     </Link>
     </Link>
@@ -143,7 +141,6 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
-      <StackReserveSize>0x400000,0x400000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -165,7 +162,6 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;user32.lib</AdditionalDependencies>
-      <StackReserveSize>0x400000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemGroup>
   <ItemGroup>

+ 0 - 4
hlc.vcxproj

@@ -98,7 +98,6 @@
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
-      <StackReserveSize>0x200000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -113,7 +112,6 @@
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
-      <StackReserveSize>0x200000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -135,7 +133,6 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
-      <StackReserveSize>0x200000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -156,7 +153,6 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
       <AdditionalDependencies>std.lib;sdl.lib;fmt.lib;ui.lib</AdditionalDependencies>
-      <StackReserveSize>0x200000</StackReserveSize>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemGroup>
   <ItemGroup>

+ 0 - 4
src/hl.h

@@ -440,11 +440,7 @@ HL_API void hl_error_msg( const uchar *msg, ... );
 HL_API void hl_throw( vdynamic *v );
 HL_API void hl_throw( vdynamic *v );
 HL_API void hl_rethrow( vdynamic *v );
 HL_API void hl_rethrow( vdynamic *v );
 HL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack );
 HL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack );
-
 HL_API varray *hl_exception_stack();
 HL_API varray *hl_exception_stack();
-HL_API int hl_get_stack_hash();
-HL_API void **hl_stack_from_hash( int hash, int *count );
-HL_API uchar *hl_resolve_symbol( void *addr, uchar *out, int *outSize );
 
 
 HL_API vvirtual *hl_to_virtual( hl_type *vt, vdynamic *obj );
 HL_API vvirtual *hl_to_virtual( hl_type *vt, vdynamic *obj );
 HL_API void hl_init_virtual( hl_type *vt, hl_module_context *ctx );
 HL_API void hl_init_virtual( hl_type *vt, hl_module_context *ctx );

+ 17 - 7
src/hlc_main.c

@@ -72,6 +72,17 @@ static int hlc_capture_stack( void **stack, int size ) {
 	return count;
 	return count;
 }
 }
 
 
+#ifdef HL_VCC
+static int throw_handler( int code ) {
+	switch( code ) {
+	case EXCEPTION_ACCESS_VIOLATION: hl_error("Access violation");
+	case EXCEPTION_STACK_OVERFLOW: hl_error("Stack overflow");
+	default: hl_error("Unknown runtime error");
+	}
+	return EXCEPTION_CONTINUE_SEARCH;
+}
+#endif
+
 #ifdef HL_WIN
 #ifdef HL_WIN
 int wmain(int argc, uchar *argv[]) {
 int wmain(int argc, uchar *argv[]) {
 #else
 #else
@@ -83,12 +94,14 @@ int main(int argc, char *argv[]) {
 	hl_setup_exception(hlc_resolve_symbol,hlc_capture_stack);
 	hl_setup_exception(hlc_resolve_symbol,hlc_capture_stack);
 	hl_setup_callbacks(hlc_static_call, hlc_get_wrapper);
 	hl_setup_callbacks(hlc_static_call, hlc_get_wrapper);
 	hl_sys_init(argv + 1,argc - 1);
 	hl_sys_init(argv + 1,argc - 1);
-#	ifdef _DEBUG
-//	disable crt debug since it will prevent reusing our address space
-//	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF /*| _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF*/ );
-#	endif
 	hl_trap(ctx, exc, on_exception);
 	hl_trap(ctx, exc, on_exception);
+#	ifdef HL_VCC
+	__try {
+#	endif
 	hl_entry_point();
 	hl_entry_point();
+#	ifdef HL_VCC
+	} __except( throw_handler(GetExceptionCode()) ) {}
+#	endif
 	hl_global_free();
 	hl_global_free();
 	return 0;
 	return 0;
 on_exception:
 on_exception:
@@ -98,9 +111,6 @@ on_exception:
 		uprintf(USTR("Uncaught exception: %s\n"), hl_to_string(exc));
 		uprintf(USTR("Uncaught exception: %s\n"), hl_to_string(exc));
 		for(i=0;i<a->size;i++)
 		for(i=0;i<a->size;i++)
 			uprintf(USTR("Called from %s\n"), hl_aptr(a,uchar*)[i]);
 			uprintf(USTR("Called from %s\n"), hl_aptr(a,uchar*)[i]);
-#		ifdef _DEBUG
-		_CrtCheckMemory();
-#		endif
 		hl_debug_break();
 		hl_debug_break();
 	}
 	}
 	hl_global_free();
 	hl_global_free();

+ 18 - 8
src/main.c

@@ -69,6 +69,17 @@ static hl_code *load_code( const pchar *file ) {
 	return code;
 	return code;
 }
 }
 
 
+#ifdef HL_VCC
+static int throw_handler( int code ) {
+	switch( code ) {
+	case EXCEPTION_ACCESS_VIOLATION: hl_error("Access violation");
+	case EXCEPTION_STACK_OVERFLOW: hl_error("Stack overflow");
+	default: hl_error("Unknown runtime error");
+	}
+	return EXCEPTION_CONTINUE_SEARCH;
+}
+#endif
+
 #ifdef HL_WIN
 #ifdef HL_WIN
 int wmain(int argc, uchar *argv[]) {
 int wmain(int argc, uchar *argv[]) {
 #else
 #else
@@ -84,10 +95,6 @@ int main(int argc, char *argv[]) {
 		printf("HLVM %d.%d.%d (c)2015-2016 Haxe Foundation\n  Usage : hl <file>\n",HL_VERSION/100,(HL_VERSION/10)%10,HL_VERSION%10);
 		printf("HLVM %d.%d.%d (c)2015-2016 Haxe Foundation\n  Usage : hl <file>\n",HL_VERSION/100,(HL_VERSION/10)%10,HL_VERSION%10);
 		return 1;
 		return 1;
 	}
 	}
-#	ifdef _DEBUG
-//	disable crt debug since it will prevent reusing our address space
-//	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF /*| _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF*/ );
-#	endif
 	hl_global_init(&ctx);
 	hl_global_init(&ctx);
 	hl_sys_init(argv + 2,argc - 2);
 	hl_sys_init(argv + 2,argc - 2);
 	ctx.code = load_code(argv[1]);
 	ctx.code = load_code(argv[1]);
@@ -100,7 +107,13 @@ int main(int argc, char *argv[]) {
 		return 3;
 		return 3;
 	hl_code_free(ctx.code);
 	hl_code_free(ctx.code);
 	hl_trap(trap, ctx.exc, on_exception);
 	hl_trap(trap, ctx.exc, on_exception);
-	hl_callback(ctx.m->functions_ptrs[ctx.m->code->entrypoint],ctx.code->functions[ctx.m->functions_indexes[ctx.m->code->entrypoint]].type,NULL,NULL);
+#	ifdef HL_VCC
+	__try {
+#	endif
+		hl_callback(ctx.m->functions_ptrs[ctx.m->code->entrypoint],ctx.code->functions[ctx.m->functions_indexes[ctx.m->code->entrypoint]].type,NULL,NULL);
+#	ifdef HL_VCC
+	} __except( throw_handler(GetExceptionCode()) ) {}
+#	endif
 	hl_module_free(ctx.m);
 	hl_module_free(ctx.m);
 	hl_free(&ctx.code->alloc);
 	hl_free(&ctx.code->alloc);
 	hl_global_free();
 	hl_global_free();
@@ -112,9 +125,6 @@ on_exception:
 		uprintf(USTR("Uncaught exception: %s\n"), hl_to_string(ctx.exc));
 		uprintf(USTR("Uncaught exception: %s\n"), hl_to_string(ctx.exc));
 		for(i=0;i<a->size;i++)
 		for(i=0;i<a->size;i++)
 			uprintf(USTR("Called from %s\n"), hl_aptr(a,uchar*)[i]);
 			uprintf(USTR("Called from %s\n"), hl_aptr(a,uchar*)[i]);
-#		ifdef _DEBUG
-		_CrtCheckMemory();
-#		endif
 		hl_debug_break();
 		hl_debug_break();
 	}
 	}
 	hl_global_free();
 	hl_global_free();