*
* If we continue with the shutdown without waiting for it, then the client might
* not receive an answer to its last command like a resume.
- * The WaitForSingleObject infrastructure doesn't seem to work during shutdown, so
- * use pthreads.
*/
- //WaitForSingleObject (debugger_thread_handle, INFINITE);
if (GetCurrentThreadId () != debugger_thread_id) {
do {
MONO_TRY_BLOCKING
mono_mutex_lock (&debugger_thread_exited_mutex);
- if (!debugger_thread_exited) {
-#ifdef HOST_WIN32
- if (WAIT_TIMEOUT == WaitForSingleObject(debugger_thread_exited_cond, 0)) {
- mono_mutex_unlock (&debugger_thread_exited_mutex);
- Sleep(1);
- mono_mutex_lock (&debugger_thread_exited_mutex);
- }
-#else
+ if (!debugger_thread_exited)
mono_cond_wait (&debugger_thread_exited_cond, &debugger_thread_exited_mutex);
-#endif
- }
mono_mutex_unlock (&debugger_thread_exited_mutex);
MONO_FINISH_TRY_BLOCKING
} while (!debugger_thread_exited);
static void
suspend_current (void)
{
-#ifndef HOST_WIN32
- int err;
-#endif
DebuggerTlsData *tls;
+ int err;
g_assert (debugger_thread_id != GetCurrentThreadId ());
MONO_TRY_BLOCKING
while (suspend_count - tls->resume_count > 0) {
-#ifdef HOST_WIN32
- if (WAIT_TIMEOUT == WaitForSingleObject(suspend_cond, 0))
- {
- mono_mutex_unlock (&suspend_mutex);
- Sleep(1);
- mono_mutex_lock (&suspend_mutex);
- }
- else
- {
- }
-#else
err = mono_cond_wait (&suspend_cond, &suspend_mutex);
g_assert (err == 0);
-#endif
}
MONO_FINISH_TRY_BLOCKING
MonoDebugMethodInfo *minfo = mono_debug_lookup_method (method);
if (minfo) {
- mono_debug_symfile_get_line_numbers_full (minfo, &source_file, &source_file_list, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ mono_debug_get_seq_points (minfo, &source_file, &source_file_list, NULL, NULL, NULL);
for (i = 0; i < source_file_list->len; ++i) {
sinfo = g_ptr_array_index (source_file_list, i);
/*
return ERR_INVALID_ARGUMENT;
}
m = mono_object_get_virtual_method (this, m);
+ /* Transform this to the format the rest of the code expects it to be */
+ if (m->klass->valuetype) {
+ this_buf = g_alloca (mono_class_instance_size (m->klass));
+ memcpy (this_buf, mono_object_unbox (this), mono_class_instance_size (m->klass));
+ }
} else if ((m->flags & METHOD_ATTRIBUTE_VIRTUAL) && !m->klass->valuetype && invoke->flags & INVOKE_FLAG_VIRTUAL) {
if (!this) {
DEBUG_PRINTF (1, "[%p] Error: invoke with INVOKE_FLAG_VIRTUAL flag set without this argument.\n", (gpointer)GetCurrentThreadId ());
return ERR_INVALID_ARGUMENT;
}
m = mono_object_get_virtual_method (this, m);
+ if (m->klass->valuetype) {
+ this_buf = g_alloca (mono_class_instance_size (m->klass));
+ memcpy (this_buf, mono_object_unbox (this), mono_class_instance_size (m->klass));
+ }
}
DEBUG_PRINTF (1, "[%p] Invoking method '%s' on receiver '%s'.\n", (gpointer)GetCurrentThreadId (), mono_method_full_name (m, TRUE), this ? this->vtable->klass->name : "<null>");
GPtrArray *source_file_list;
if (minfo) {
- mono_debug_symfile_get_line_numbers_full (minfo, NULL, &source_file_list, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ mono_debug_get_seq_points (minfo, NULL, &source_file_list, NULL, NULL, NULL);
for (j = 0; j < source_file_list->len; ++j) {
sinfo = g_ptr_array_index (source_file_list, j);
for (i = 0; i < files->len; ++i)
MonoDebugMethodInfo *minfo;
char *source_file;
int i, j, n_il_offsets;
- int *il_offsets;
- int *line_numbers;
- int *column_numbers;
- int *end_line_numbers;
- int *end_column_numbers;
int *source_files;
GPtrArray *source_file_list;
+ MonoSymSeqPoint *sym_seq_points;
header = mono_method_get_header (method);
if (!header) {
break;
}
- mono_debug_symfile_get_line_numbers_full (minfo, &source_file, &source_file_list, &n_il_offsets, &il_offsets, &line_numbers, &column_numbers, &source_files, &end_line_numbers, &end_column_numbers);
+ mono_debug_get_seq_points (minfo, &source_file, &source_file_list, &source_files, &sym_seq_points, &n_il_offsets);
buffer_add_int (buf, header->code_size);
if (CHECK_PROTOCOL_VERSION (2, 13)) {
buffer_add_int (buf, source_file_list->len);
buffer_add_int (buf, n_il_offsets);
DEBUG_PRINTF (10, "Line number table for method %s:\n", mono_method_full_name (method, TRUE));
for (i = 0; i < n_il_offsets; ++i) {
+ MonoSymSeqPoint *sp = &sym_seq_points [i];
const char *srcfile = "";
if (source_files [i] != -1) {
MonoDebugSourceInfo *sinfo = g_ptr_array_index (source_file_list, source_files [i]);
srcfile = sinfo->source_file;
}
- DEBUG_PRINTF (10, "IL%x -> %s:%d %d %d %d\n", il_offsets [i], srcfile, line_numbers [i], column_numbers ? column_numbers [i] : -1, end_line_numbers ? end_line_numbers [i] : -1, end_column_numbers ? end_column_numbers [i] : -1);
- buffer_add_int (buf, il_offsets [i]);
- buffer_add_int (buf, line_numbers [i]);
+ DEBUG_PRINTF (10, "IL%x -> %s:%d %d %d %d\n", sp->il_offset, srcfile, sp->line, sp->column, sp->end_line, sp->end_column);
+ buffer_add_int (buf, sp->il_offset);
+ buffer_add_int (buf, sp->line);
if (CHECK_PROTOCOL_VERSION (2, 13))
buffer_add_int (buf, source_files [i]);
if (CHECK_PROTOCOL_VERSION (2, 19))
- buffer_add_int (buf, column_numbers ? column_numbers [i] : -1);
+ buffer_add_int (buf, sp->column);
if (CHECK_PROTOCOL_VERSION (2, 32)) {
- buffer_add_int (buf, end_line_numbers ? end_line_numbers [i] : -1);
- buffer_add_int (buf, end_column_numbers ? end_column_numbers [i] : -1);
+ buffer_add_int (buf, sp->end_line);
+ buffer_add_int (buf, sp->end_column);
}
}
g_free (source_file);
- g_free (il_offsets);
- g_free (line_numbers);
- g_free (column_numbers);
- g_free (end_line_numbers);
- g_free (end_column_numbers);
g_free (source_files);
+ g_free (sym_seq_points);
g_ptr_array_free (source_file_list, TRUE);
mono_metadata_free_mh (header);
break;
case CMD_METHOD_GET_LOCALS_INFO: {
int i, j, num_locals;
MonoDebugLocalsInfo *locals;
+ int *locals_map = NULL;
header = mono_method_get_header (method);
if (!header)
return ERR_INVALID_ARGUMENT;
- buffer_add_int (buf, header->num_locals);
-
- /* Types */
- for (i = 0; i < header->num_locals; ++i)
- buffer_add_typeid (buf, domain, mono_class_from_mono_type (header->locals [i]));
-
- /* Names */
locals = mono_debug_lookup_locals (method);
- if (locals)
- num_locals = locals->num_locals;
- else
- num_locals = 0;
- for (i = 0; i < header->num_locals; ++i) {
- for (j = 0; j < num_locals; ++j)
- if (locals->locals [j].index == i)
- break;
- if (j < num_locals)
- buffer_add_string (buf, locals->locals [j].name);
- else
- buffer_add_string (buf, "");
- }
-
- /* Scopes */
- for (i = 0; i < header->num_locals; ++i) {
- for (j = 0; j < num_locals; ++j)
- if (locals->locals [j].index == i)
- break;
- if (j < num_locals && locals->locals [j].block) {
- buffer_add_int (buf, locals->locals [j].block->start_offset);
- buffer_add_int (buf, locals->locals [j].block->end_offset);
- } else {
+ if (!locals) {
+ buffer_add_int (buf, header->num_locals);
+ /* Types */
+ for (i = 0; i < header->num_locals; ++i) {
+ buffer_add_typeid (buf, domain, mono_class_from_mono_type (header->locals [i]));
+ }
+ /* Names */
+ for (i = 0; i < header->num_locals; ++i) {
+ char lname [128];
+ sprintf (lname, "V_%d", i);
+ buffer_add_string (buf, lname);
+ }
+ /* Scopes */
+ for (i = 0; i < header->num_locals; ++i) {
buffer_add_int (buf, 0);
buffer_add_int (buf, header->code_size);
}
+ } else {
+ /* Maps between the IL locals index and the index in locals->locals */
+ locals_map = g_new0 (int, header->num_locals);
+ for (i = 0; i < header->num_locals; ++i)
+ locals_map [i] = -1;
+ num_locals = locals->num_locals;
+ for (i = 0; i < num_locals; ++i) {
+ g_assert (locals->locals [i].index < header->num_locals);
+ locals_map [locals->locals [i].index] = i;
+ }
+ buffer_add_int (buf, num_locals);
+
+ /* Types */
+ for (i = 0; i < header->num_locals; ++i) {
+ if (locals_map [i] != -1)
+ buffer_add_typeid (buf, domain, mono_class_from_mono_type (header->locals [i]));
+ }
+
+ /* Names */
+ for (i = 0; i < header->num_locals; ++i) {
+ if (locals_map [i] != -1)
+ buffer_add_string (buf, locals->locals [locals_map [i]].name);
+ }
+
+ /* Scopes */
+ for (i = 0; i < header->num_locals; ++i) {
+ if (locals_map [i] != -1) {
+ j = locals_map [i];
+ if (locals->locals [j].block) {
+ buffer_add_int (buf, locals->locals [j].block->start_offset);
+ buffer_add_int (buf, locals->locals [j].block->end_offset);
+ } else {
+ buffer_add_int (buf, 0);
+ buffer_add_int (buf, header->code_size);
+ }
+ }
+ }
}
mono_metadata_free_mh (header);
if (locals)
- mono_debug_symfile_free_locals (locals);
+ mono_debug_free_locals (locals);
+ g_free (locals_map);
break;
}
if (pos < 0) {
pos = - pos - 1;
+ DEBUG_PRINTF (4, "[dbg] send arg %d.\n", pos);
+
g_assert (pos >= 0 && pos < jit->num_params);
add_var (buf, jit, sig->params [pos], &jit->params [pos], &frame->ctx, frame->domain, FALSE);
} else {
+ MonoDebugLocalsInfo *locals;
+
+ locals = mono_debug_lookup_locals (frame->method);
+ if (locals) {
+ g_assert (pos < locals->num_locals);
+ pos = locals->locals [pos].index;
+ mono_debug_free_locals (locals);
+ }
g_assert (pos >= 0 && pos < jit->num_locals);
+ DEBUG_PRINTF (4, "[dbg] send local %d.\n", pos);
+
add_var (buf, jit, header->locals [pos], &jit->locals [pos], &frame->ctx, frame->domain, FALSE);
}
}
t = sig->params [pos];
var = &jit->params [pos];
} else {
+ MonoDebugLocalsInfo *locals;
+
+ locals = mono_debug_lookup_locals (frame->method);
+ if (locals) {
+ g_assert (pos < locals->num_locals);
+ pos = locals->locals [pos].index;
+ mono_debug_free_locals (locals);
+ }
g_assert (pos >= 0 && pos < jit->num_locals);
t = header->locals [pos];