Skip to content

Commit

Permalink
[Mono]: Add dotnet-gcdump support. (#88634)
Browse files Browse the repository at this point in the history
Add support for dotnet-gcdump on Mono.

New GC events consumed by dotnet-gcdump has been added to the new ep-rt-mono-runtime-provider.c source file.

Disable experimental EventPipe mono profiler provider by default to preserve resources. It is possible to re-enable it by setting the following env variable, MONO_DIAGNOSTICS=--diagnostic-mono-profiler=enable.
  • Loading branch information
lateralusX authored Jul 16, 2023
1 parent 4be3386 commit f0d1e53
Show file tree
Hide file tree
Showing 16 changed files with 8,666 additions and 7,669 deletions.
28 changes: 25 additions & 3 deletions src/coreclr/scripts/genEventPipe.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,8 +662,16 @@ def getMonoEventPipeHelperFileImplPrefix():
size_t *size,
bool *fixed_buffer)
{
if (!value)
if (!value || value_len == 0) {
value_len = sizeof (ep_char16_t);
if ((value_len + *offset) > *size)
ep_raise_error_if_nok (resize_buffer (buffer, size, *offset, *size + value_len, fixed_buffer));
(*buffer) [*offset] = 0;
(*offset)++;
(*buffer) [*offset] = 0;
(*offset)++;
return true;
}
GFixedBufferCustomAllocatorData custom_alloc_data;
custom_alloc_data.buffer = *buffer + *offset;
Expand Down Expand Up @@ -695,9 +703,23 @@ def getMonoEventPipeHelperFileImplPrefix():
bool *fixed_buffer)
{
if (!value)
return true;
value_len = 0;
if ((value_len + 1 + *offset) > *size)
ep_raise_error_if_nok (resize_buffer (buffer, size, *offset, *size + value_len + 1, fixed_buffer));
if (value_len != 0) {
memcpy (*buffer + *offset, value, value_len);
*offset += value_len;
}
return write_buffer ((const uint8_t *)value, (value_len + 1) * sizeof(*value), buffer, offset, size, fixed_buffer);
(*buffer) [*offset] = 0;
(*offset)++;
return true;
ep_on_error:
return false;
}
"""
Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/scripts/genEventing.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,7 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern

eventpipeProviderCtxName = providerSymbol + "_EVENTPIPE_Context"
if is_windows:
Clrallevents.write(('constexpr ' if target_cpp else '') + 'EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
Clrallevents.write(('constexpr ' if target_cpp else 'static const ') + 'EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')

if not is_windows and not write_xplatheader:
Clrallevents.write('__attribute__((weak)) EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
Expand Down Expand Up @@ -782,14 +782,14 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
symbolName = eventNode.getAttribute('symbol')
keywords = eventNode.getAttribute('keywords')
level = convertToLevelId(levelName)
Clrproviders.write(("constexpr " if target_cpp else "const ") + "EVENT_DESCRIPTOR " + symbolName + " = { " + str(level) + ", " + hex(getKeywordsMaskCombined(keywords, keywordsToMask)) + " };\n")
Clrproviders.write(("constexpr " if target_cpp else "static const ") + "EVENT_DESCRIPTOR " + symbolName + " = { " + str(level) + ", " + hex(getKeywordsMaskCombined(keywords, keywordsToMask)) + " };\n")

allProviders.append("&" + providerSymbol + "_LTTNG_Context")

# define and initialize runtime providers' DOTNET_TRACE_CONTEXT depending on the platform
if not is_windows:
Clrproviders.write('#define NB_PROVIDERS ' + str(nbProviders) + '\n')
Clrproviders.write(('constexpr ' if target_cpp else 'const ') + 'LTTNG_TRACE_CONTEXT * ALL_LTTNG_PROVIDERS_CONTEXT[NB_PROVIDERS] = { ')
Clrproviders.write(('constexpr ' if target_cpp else 'static const ') + 'LTTNG_TRACE_CONTEXT * ALL_LTTNG_PROVIDERS_CONTEXT[NB_PROVIDERS] = { ')
Clrproviders.write(', '.join(allProviders))
Clrproviders.write(' };\n')

Expand Down
3 changes: 1 addition & 2 deletions src/mono/mono/component/event_pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include <emscripten/emscripten.h>
#endif

extern void ep_rt_mono_component_init (void);
static bool _event_pipe_component_inited = false;

struct _EventPipeProviderConfigurationNative {
Expand Down Expand Up @@ -127,7 +126,7 @@ static MonoComponentEventPipe fn_table = {
&ep_provider_add_event,
&event_pipe_get_session_info,
&event_pipe_thread_ctrl_activity_id,
&ep_rt_mono_write_event_ee_startup_start,
&ep_rt_write_event_ee_startup_start,
&ep_rt_write_event_threadpool_worker_thread_start,
&ep_rt_write_event_threadpool_worker_thread_stop,
&ep_rt_write_event_threadpool_worker_thread_wait,
Expand Down
1 change: 1 addition & 0 deletions src/mono/mono/eglib/glib.h
Original file line number Diff line number Diff line change
Expand Up @@ -1635,6 +1635,7 @@ __CAST_UTYPE_TO_STYPE(gunichar, gchar, CHAR_MIN, CHAR_MAX)

#define GLONG_TO_ULONG(v) G_CAST_TYPE_TO_TYPE(glong, gulong, v)
#define GULONG_TO_LONG(v) G_CAST_TYPE_TO_TYPE(gulong, glong, v)
#define GLONG_TO_UINT32(v) G_CAST_TYPE_TO_TYPE(glong, guint32, v)

#define GDOUBLE_TO_INT64(v) G_CAST_TYPE_TO_TYPE(gdouble, gint64, v)
#define GDOUBLE_TO_UINT64(v) G_CAST_TYPE_TO_TYPE(gdouble, guint64, v)
Expand Down
4 changes: 2 additions & 2 deletions src/mono/mono/eventpipe/ds-rt-mono.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ static
uint32_t
ds_rt_set_environment_variable (const ep_char16_t *name, const ep_char16_t *value)
{
gchar *nameNarrow = ep_rt_utf16le_to_utf8_string (name, ep_rt_utf16_string_len (name));
gchar *valueNarrow = ep_rt_utf16le_to_utf8_string (value, ep_rt_utf16_string_len (value));
gchar *nameNarrow = ep_rt_utf16le_to_utf8_string (name, -1);
gchar *valueNarrow = ep_rt_utf16le_to_utf8_string (value, -1);

gboolean success = g_setenv(nameNarrow, valueNarrow, true);

Expand Down
Loading

0 comments on commit f0d1e53

Please sign in to comment.