+/*
+ * debug-debugger.c: Hard debugger support (mdb)
+ *
+ * Author:
+ *
+ * Copyright 2006-2010 Novell, Inc.
+ */
+#if MONO_DEBUGGER_SUPPORTED
+
#include <config.h>
#include <mono/io-layer/io-layer.h>
#include <mono/metadata/threads.h>
* configure.in checks whether we're using the included libgc and disables the debugger if not.
*/
-#if !defined(MONO_DEBUGGER_SUPPORTED)
-#error "Some clown tried to compile debug-debugger.c on an unsupported platform - fix Makefile.am!"
-#elif !defined(USE_INCLUDED_LIBGC)
-#error "Some clown #defined MONO_DEBUGGER_SUPPORTED without USE_INCLUDED_GC - fix configure.in!"
+#if !defined(USE_INCLUDED_LIBGC)
+#error "Inconsistency detected: #defined MONO_DEBUGGER_SUPPORTED without USE_INCLUDED_GC - fix configure.in!"
#endif
static guint64 debugger_compile_method (guint64 method_arg);
static void debugger_remove_class_init_callback (guint64 index, G_GNUC_UNUSED guint64 dummy);
static guint64 debugger_get_method_signature (guint64 argument1, G_GNUC_UNUSED guint64 argument2);
+static guint64 debugger_abort_runtime_invoke (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2);
+
#define EXECUTABLE_CODE_BUFFER_SIZE 4096
static guint8 *debugger_executable_code_buffer = NULL;
static GCThreadFunctions debugger_thread_vtable;
+static guint32 debugger_thread_abort_signal = 0;
+
static MonoDebuggerMetadataInfo debugger_metadata_info = {
sizeof (MonoDebuggerMetadataInfo),
sizeof (MonoDefaults),
&mono_defaults,
- sizeof (MonoType),
+ MONO_SIZEOF_TYPE,
sizeof (MonoArrayType),
sizeof (MonoClass),
- sizeof (MonoThread),
- G_STRUCT_OFFSET (MonoThread, tid),
- G_STRUCT_OFFSET (MonoThread, stack_ptr),
- G_STRUCT_OFFSET (MonoThread, end_stack),
+ sizeof (MonoInternalThread),
+ G_STRUCT_OFFSET (MonoInternalThread, tid),
+ G_STRUCT_OFFSET (MonoInternalThread, stack_ptr),
+ G_STRUCT_OFFSET (MonoInternalThread, end_stack),
G_STRUCT_OFFSET (MonoClass, image),
G_STRUCT_OFFSET (MonoClass, instance_size),
G_STRUCT_OFFSET (MonoClass, parent),
MONO_DEBUGGER_MAGIC,
MONO_DEBUGGER_MAJOR_VERSION,
MONO_DEBUGGER_MINOR_VERSION,
- 0, /* dummy */
+ 0, /* runtime_flags */
sizeof (MonoDebuggerInfo),
sizeof (MonoSymbolTable),
MONO_TRAMPOLINE_NUM,
debugger_event_handler,
&_mono_debug_using_mono_debugger,
- (gint32*)&_mono_debugger_interruption_request
+ (gint32*)&_mono_debugger_interruption_request,
+
+ &debugger_abort_runtime_invoke,
+
+ &debugger_thread_abort_signal
};
+static guint64
+debugger_abort_runtime_invoke (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2)
+{
+ return mono_debugger_abort_runtime_invoke ();
+}
+
static guint64
debugger_compile_method (guint64 method_arg)
{
debugger_executable_code_buffer = mono_global_codeman_reserve (EXECUTABLE_CODE_BUFFER_SIZE);
mono_debugger_event_handler = debugger_event_handler;
+ debugger_thread_abort_signal = mono_thread_get_abort_signal ();
+
/*
* Use an indirect call so gcc can't optimize it away.
*/
(guint64) (gssize) MONO_DEBUGGER__debugger_info_ptr, 0);
}
+void
+mini_debugger_set_attach_ok (void)
+{
+ debugger_thread_abort_signal = mono_thread_get_abort_signal ();
+ MONO_DEBUGGER__debugger_info.runtime_flags |= DEBUGGER_RUNTIME_FLAGS_ATTACH_OK;
+}
+
typedef struct
{
MonoDomain *domain;
return 0;
}
+#endif /* MONO_DEBUGGER_SUPPORTED */