Skip to content

Commit f0d1e53

Browse files
authored
[Mono]: Add dotnet-gcdump support. (#88634)
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.
1 parent 4be3386 commit f0d1e53

File tree

16 files changed

+8666
-7669
lines changed

16 files changed

+8666
-7669
lines changed

src/coreclr/scripts/genEventPipe.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -662,8 +662,16 @@ def getMonoEventPipeHelperFileImplPrefix():
662662
size_t *size,
663663
bool *fixed_buffer)
664664
{
665-
if (!value)
665+
if (!value || value_len == 0) {
666+
value_len = sizeof (ep_char16_t);
667+
if ((value_len + *offset) > *size)
668+
ep_raise_error_if_nok (resize_buffer (buffer, size, *offset, *size + value_len, fixed_buffer));
669+
(*buffer) [*offset] = 0;
670+
(*offset)++;
671+
(*buffer) [*offset] = 0;
672+
(*offset)++;
666673
return true;
674+
}
667675
668676
GFixedBufferCustomAllocatorData custom_alloc_data;
669677
custom_alloc_data.buffer = *buffer + *offset;
@@ -695,9 +703,23 @@ def getMonoEventPipeHelperFileImplPrefix():
695703
bool *fixed_buffer)
696704
{
697705
if (!value)
698-
return true;
706+
value_len = 0;
707+
708+
if ((value_len + 1 + *offset) > *size)
709+
ep_raise_error_if_nok (resize_buffer (buffer, size, *offset, *size + value_len + 1, fixed_buffer));
710+
711+
if (value_len != 0) {
712+
memcpy (*buffer + *offset, value, value_len);
713+
*offset += value_len;
714+
}
699715
700-
return write_buffer ((const uint8_t *)value, (value_len + 1) * sizeof(*value), buffer, offset, size, fixed_buffer);
716+
(*buffer) [*offset] = 0;
717+
(*offset)++;
718+
719+
return true;
720+
721+
ep_on_error:
722+
return false;
701723
}
702724
703725
"""

src/coreclr/scripts/genEventing.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
731731

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

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

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

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

src/mono/mono/component/event_pipe.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include <emscripten/emscripten.h>
1818
#endif
1919

20-
extern void ep_rt_mono_component_init (void);
2120
static bool _event_pipe_component_inited = false;
2221

2322
struct _EventPipeProviderConfigurationNative {
@@ -127,7 +126,7 @@ static MonoComponentEventPipe fn_table = {
127126
&ep_provider_add_event,
128127
&event_pipe_get_session_info,
129128
&event_pipe_thread_ctrl_activity_id,
130-
&ep_rt_mono_write_event_ee_startup_start,
129+
&ep_rt_write_event_ee_startup_start,
131130
&ep_rt_write_event_threadpool_worker_thread_start,
132131
&ep_rt_write_event_threadpool_worker_thread_stop,
133132
&ep_rt_write_event_threadpool_worker_thread_wait,

src/mono/mono/eglib/glib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,6 +1635,7 @@ __CAST_UTYPE_TO_STYPE(gunichar, gchar, CHAR_MIN, CHAR_MAX)
16351635

16361636
#define GLONG_TO_ULONG(v) G_CAST_TYPE_TO_TYPE(glong, gulong, v)
16371637
#define GULONG_TO_LONG(v) G_CAST_TYPE_TO_TYPE(gulong, glong, v)
1638+
#define GLONG_TO_UINT32(v) G_CAST_TYPE_TO_TYPE(glong, guint32, v)
16381639

16391640
#define GDOUBLE_TO_INT64(v) G_CAST_TYPE_TO_TYPE(gdouble, gint64, v)
16401641
#define GDOUBLE_TO_UINT64(v) G_CAST_TYPE_TO_TYPE(gdouble, guint64, v)

src/mono/mono/eventpipe/ds-rt-mono.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ static
214214
uint32_t
215215
ds_rt_set_environment_variable (const ep_char16_t *name, const ep_char16_t *value)
216216
{
217-
gchar *nameNarrow = ep_rt_utf16le_to_utf8_string (name, ep_rt_utf16_string_len (name));
218-
gchar *valueNarrow = ep_rt_utf16le_to_utf8_string (value, ep_rt_utf16_string_len (value));
217+
gchar *nameNarrow = ep_rt_utf16le_to_utf8_string (name, -1);
218+
gchar *valueNarrow = ep_rt_utf16le_to_utf8_string (value, -1);
219219

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

0 commit comments

Comments
 (0)