Ver Fonte

added hl_debug_break linux support

Nicolas Cannasse há 7 anos atrás
pai
commit
96498149b9
2 ficheiros alterados com 32 adições e 0 exclusões
  1. 8 0
      src/hl.h
  2. 24 0
      src/std/error.c

+ 8 - 0
src/hl.h

@@ -194,6 +194,13 @@ C_FUNCTION_END
 #	define hl_debug_break()	if( IsDebuggerPresent() ) __debugbreak()
 #elif defined(HL_PS)
 #	define hl_debug_break()	__debugbreak()
+#elif defined(HL_LINUX)
+#	define hl_debug_break() \
+		if( hl_detect_debugger() ) \
+			__asm__("0:" \
+			    ".pushsection embed-breakpoints;" \
+			    ".quad 0b;" \
+			    ".popsection")
 #else
 #	define hl_debug_break()
 #endif
@@ -491,6 +498,7 @@ HL_API void hl_setup_longjump( void *j );
 HL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack );
 HL_API void hl_dump_stack();
 HL_API varray *hl_exception_stack();
+HL_API bool hl_detect_debugger();
 
 HL_API vvirtual *hl_to_virtual( hl_type *vt, vdynamic *obj );
 HL_API void hl_init_virtual( hl_type *vt, hl_module_context *ctx );

+ 24 - 0
src/std/error.c

@@ -165,6 +165,30 @@ HL_PRIM void hl_breakpoint() {
 	hl_debug_break();
 }
 
+#ifdef HL_LINUX
+#include <signal.h>
+static int debugger_present = -1;
+static void _sigtrap_handler(int signum) {
+	debugger_present = 0;
+	signal(SIGTRAP,SIG_DFL);
+}
+#endif
+
+HL_PRIM bool hl_detect_debugger() {
+#	if defined(HL_WIN)
+	return IsDebuggerPresent();
+#	elif defined(HL_LINUX)
+	if( debugger_present == -1 ) {
+		debugger_present = 1;
+		signal(SIGTRAP,_sigtrap_handler);
+		raise(SIGTRAP);
+	}
+	return (bool)debugger_present;
+#	else
+	return false;
+#	endif
+}
+
 HL_PRIM void hl_assert() {
 	hl_debug_break();
 	hl_error("Assert");