Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 73 additions & 55 deletions src/mono/mono/component/debugger-agent.c
Original file line number Diff line number Diff line change
Expand Up @@ -4122,7 +4122,14 @@ jit_end (MonoProfiler *prof, MonoMethod *method, MonoJitInfo *jinfo)
dbg_unlock ();

if (assembly) {
process_profiler_event (EVENT_KIND_ASSEMBLY_LOAD, assembly);
DebuggerTlsData *tls;
tls = (DebuggerTlsData *)mono_native_tls_get_value (debugger_tls_id);
if (tls->invoke == NULL) {
process_profiler_event (EVENT_KIND_ASSEMBLY_LOAD, assembly);
} else {
assembly_load(prof, assembly); //send later
break;
}
} else {
break;
}
Expand Down Expand Up @@ -5043,20 +5050,16 @@ buffer_add_info_for_null_value (Buffer* buf, MonoType* t, MonoDomain* domain)
{
buffer_add_byte (buf, t->type);
switch (t->type) {
case MONO_TYPE_CLASS:
case MONO_TYPE_STRING:
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (t));
break;
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
buffer_add_byte (buf, m_class_get_byval_arg (m_class_get_element_class (mono_class_from_mono_type_internal (t)))->type);
buffer_add_int (buf, m_class_get_rank (mono_class_from_mono_type_internal (t)));
if (m_class_get_byval_arg (m_class_get_element_class (mono_class_from_mono_type_internal (t)))->type == MONO_TYPE_CLASS)
buffer_add_typeid (buf, domain, m_class_get_element_class (mono_class_from_mono_type_internal (t)));
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (t));
break;
default:
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (t));
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
buffer_add_byte (buf, m_class_get_byval_arg (m_class_get_element_class (mono_class_from_mono_type_internal (t)))->type);
buffer_add_int (buf, m_class_get_rank (mono_class_from_mono_type_internal (t)));
if (m_class_get_byval_arg (m_class_get_element_class (mono_class_from_mono_type_internal (t)))->type == MONO_TYPE_CLASS)
buffer_add_typeid (buf, domain, m_class_get_element_class (mono_class_from_mono_type_internal (t)));
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (t));
break;
default:
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (t));
}
}
/*
Expand All @@ -5073,6 +5076,9 @@ buffer_add_value_full (Buffer *buf, MonoType *t, void *addr, MonoDomain *domain,
MonoObject *obj;
gboolean boxed_vtype = FALSE;

if (CHECK_ICORDBG (TRUE))
buffer_add_byte (buf, !!m_type_is_byref (t));

if (m_type_is_byref (t)) {
if (!(*(void**)addr)) {
/* This can happen with compiler generated locals */
Expand Down Expand Up @@ -5273,6 +5279,8 @@ buffer_add_value_full (Buffer *buf, MonoType *t, void *addr, MonoDomain *domain,
if (mono_vtype_get_field_addr (addr, f) == addr && mono_class_from_mono_type_internal (t) == mono_class_from_mono_type_internal (f->type) && !boxed_vtype) //to avoid infinite recursion
{
gssize val = *(gssize*)addr;
if (CHECK_ICORDBG (TRUE))
buffer_add_byte (buf, !!m_type_is_byref (f->type));
buffer_add_byte (buf, MONO_TYPE_PTR);
buffer_add_long (buf, val);
if (CHECK_PROTOCOL_VERSION(2, 46))
Expand Down Expand Up @@ -7940,6 +7948,17 @@ domain_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
buffer_add_objid (buf, o);
break;
}
case MDBGPROT_CMD_APPDOMAIN_GET_TYPE: {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it it only works on arrays? why is it called "get type" and not something like "create array type"

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It works also for pointers, but I'm not sure how to implement it yet, that is why I didn't implement.

MonoClass *klass;
domain = decode_domainid (p, &p, end, NULL, &err);
MonoTypeEnum type = decode_int (p, &p, end);
klass = decode_typeid (p, &p, end, NULL, &err);
int rank = decode_int (p, &p, end);
if (type == MONO_TYPE_SZARRAY || type == MONO_TYPE_ARRAY)
klass = mono_class_create_array (klass, rank);
buffer_add_typeid (buf, domain, klass);
break;
}
default:
return ERR_NOT_IMPLEMENTED;
}
Expand Down Expand Up @@ -8282,6 +8301,14 @@ field_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
}
break;
}
case MDBGPROT_CMD_FIELD_GET_TOKEN_AND_TYPE: {
MonoClassField *f = decode_fieldid (p, &p, end, &domain, &err);
buffer_add_int (buf, mono_class_get_field_token (f));
buffer_add_byte(buf, GINT_TO_UINT8(m_class_is_valuetype (mono_class_from_mono_type_internal (f->type))));
buffer_add_int (buf, f->type->type);
buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal (f->type));
break;
}
default:
return ERR_NOT_IMPLEMENTED;
}
Expand Down Expand Up @@ -8886,43 +8913,8 @@ type_commands_internal (int command, MonoClass *klass, MonoDomain *domain, guint
if (CHECK_ICORDBG (TRUE))
{
buffer_add_byte(buf, GINT_TO_UINT8(m_class_is_valuetype (klass)));
if (m_class_is_valuetype (klass))
{
int nfields = 0;
gpointer iter = NULL;
while ((f = mono_class_get_fields_internal (klass, &iter))) {
if (G_UNLIKELY (!f->type)) {
ERROR_DECL(field_error);
mono_field_resolve_type (f, field_error);
mono_error_cleanup (field_error);
if (!f->type)
continue;
}
if (f->type->attrs & FIELD_ATTRIBUTE_STATIC)
continue;
if (mono_field_is_deleted (f))
continue;
nfields ++;
}
buffer_add_int (buf, nfields);

iter = NULL;
while ((f = mono_class_get_fields_internal (klass, &iter))) {
if (G_UNLIKELY (!f->type)) {
ERROR_DECL(field_error);
mono_field_resolve_type (f, field_error);
mono_error_cleanup (field_error);
if (!f->type)
continue;
}
if (f->type->attrs & FIELD_ATTRIBUTE_STATIC)
continue;
if (mono_field_is_deleted (f))
continue;
buffer_add_int (buf, mono_class_get_field_token (f));
buffer_add_byte (buf, f->type->type);
}
}
buffer_add_int (buf, m_class_get_byval_arg (klass)->type);
buffer_add_typeid (buf, domain, klass);
}
break;
}
Expand Down Expand Up @@ -9002,6 +8994,33 @@ type_commands_internal (int command, MonoClass *klass, MonoDomain *domain, guint
buffer_add_byte (buf, m_class_get_rank (klass));
break;
}
case MDBGPROT_CMD_TYPE_GET_FIELD_RVA:
{
gpointer iter = NULL;
int field_token = decode_int (p, &p, end);
while ((f = mono_class_get_fields_internal (klass, &iter))) {
if (mono_class_get_field_token (f) == field_token)
{
if (f->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)
{
int swizzle = 1;
int align;
#if G_BYTE_ORDER != G_LITTLE_ENDIAN
swizzle = mono_type_size (type, &align);
#endif

int dummy;
int count = mono_type_size (f->type, &dummy)/mono_type_size (f->type, &align);
const char* arr = mono_field_get_rva (f, swizzle);
m_dbgprot_buffer_add_byte_array (buf, (uint8_t *)arr, count);
err = ERR_NONE;
goto exit;
}
}
}
m_dbgprot_buffer_add_int (buf, 0);
break;
}
default:
err = ERR_NOT_IMPLEMENTED;
goto exit;
Expand Down Expand Up @@ -10181,7 +10200,7 @@ array_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
MonoTypeEnum type = m_class_get_byval_arg (m_class_get_element_class (arr->obj.vtable->klass))->type;
buffer_add_byte(buf, type);
buffer_add_int (buf, m_class_get_rank (arr->obj.vtable->klass));
if (type == MONO_TYPE_CLASS || type == MONO_TYPE_GENERICINST || type == MONO_TYPE_OBJECT)
if (type == MONO_TYPE_CLASS || type == MONO_TYPE_GENERICINST || type == MONO_TYPE_OBJECT || (CHECK_ICORDBG (TRUE) && type == MONO_TYPE_VALUETYPE))
{
buffer_add_typeid (buf, arr->obj.vtable->domain, m_class_get_element_class (arr->obj.vtable->klass));
if (CHECK_ICORDBG (TRUE))
Expand Down Expand Up @@ -10389,8 +10408,7 @@ object_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
break;
}
}
if (!k)
goto invalid_fieldid;

while ((f = mono_class_get_fields_internal (k, &iter))) {
if (mono_class_get_field_token (f) == field_token) {
goto get_field_value;
Expand Down
5 changes: 4 additions & 1 deletion src/mono/mono/component/debugger-protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ typedef enum {
MDBGPROT_CMD_APPDOMAIN_GET_CORLIB = 6,
MDBGPROT_CMD_APPDOMAIN_CREATE_BOXED_VALUE = 7,
MDBGPROT_CMD_APPDOMAIN_CREATE_BYTE_ARRAY = 8,
MDBGPROT_CMD_APPDOMAIN_GET_TYPE = 9,
} MdbgProtCmdAppDomain;

typedef enum {
Expand Down Expand Up @@ -162,6 +163,7 @@ typedef enum {

typedef enum {
MDBGPROT_CMD_FIELD_GET_INFO = 1,
MDBGPROT_CMD_FIELD_GET_TOKEN_AND_TYPE = 2
} MdbgProtCmdField;

typedef enum {
Expand Down Expand Up @@ -215,7 +217,8 @@ typedef enum {
MDBGPROT_CMD_TYPE_BIND_GENERIC_PARAMETERS = 24,
MDBGPROT_CMD_TYPE_ELEMENT_TYPE = 25,
MDBGPROT_CMD_TYPE_RANK = 26,
MDBGPROT_CMD_TYPE_SET_VALUES_BY_FIELD_TOKEN = 27
MDBGPROT_CMD_TYPE_SET_VALUES_BY_FIELD_TOKEN = 27,
MDBGPROT_CMD_TYPE_GET_FIELD_RVA = 28
} MdbgProtCmdType;

typedef enum {
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/metadata/class-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -1450,7 +1450,7 @@ mono_class_get_object_finalize_slot (void);
MonoMethod *
mono_class_get_default_finalize_method (void);

const char *
MONO_COMPONENT_API const char *
mono_field_get_rva (MonoClassField *field, int swizzle);

MONO_COMPONENT_API void
Expand Down