Skip to content

Commit 0f5a39d

Browse files
authored
[Mono] Add Mono Profiler events into EventPipe. (#55264)
* Add Mono Profiler events into EventPipe. * Drop callstack on exception_clause profile event. Needed since instrumentation uses mono_profiler_raise_exception_clause used without wrapper and that in turn will cause incomplete stacks due to transitioning into native code without informing unwinder. * Fix build error. * Add support to configure MonoVM diagnostics using env variable. Adding new MONO_DIAGNOSTICS env variable that can include diagnostic specific configs as well as --diagnostic-ports, meaning that its possible to use that instead of DOTNET_DiagnosticPorts variable. It also add variable to set some mono profiler settings needed very early during startup to get GC alloc as well as exception clause checks. In order to set needed options early in process, EventPipe component calls a specific component_init method setting up needed config. * Fix enable/disable callback registrations based on enable/disable bit mask. * Add ability to specify callspec for method instrumentation. Add --diagnostic-mono-profiler-callspec= to accept Mono callspec string. Split keywords to enable method tracing and instrumentation, enables ability to start instrumenting (but not emitting events) in one session and then enable emitting events in later session. If a callspec is used, instrumentation will be enabled on component init. * Only init component once when using static component builds.
1 parent ac53e65 commit 0f5a39d

File tree

7 files changed

+5357
-2096
lines changed

7 files changed

+5357
-2096
lines changed

src/coreclr/scripts/genEventPipe.py

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,19 @@ def generateMethodSignatureWrite(eventName, template, extern, runtimeFlavor):
7272
sig_pieces.append(")")
7373
return ''.join(sig_pieces)
7474

75+
def includeProvider(providerName, runtimeFlavor):
76+
if runtimeFlavor.coreclr and providerName == "Microsoft-DotNETRuntimeMonoProfiler":
77+
return False
78+
else:
79+
return True
80+
7581
def includeEvent(inclusionList, providerName, eventName):
7682
if len(inclusionList) == 0:
7783
return True
7884
if providerName in inclusionList and eventName in inclusionList[providerName]:
7985
return True
86+
elif providerName in inclusionList and "*" in inclusionList[providerName]:
87+
return True
8088
elif "*" in inclusionList and eventName in inclusionList["*"]:
8189
return True
8290
elif "*" in inclusionList and "*" in inclusionList["*"]:
@@ -340,6 +348,10 @@ def generateWriteEventBody(template, providerName, eventName, runtimeFlavor):
340348
pack_list.append(
341349
" success &= write_buffer_double_t(%s, &buffer, &offset, &size, &fixedBuffer);" %
342350
(parameter.name,))
351+
elif parameter.winType == "win:Pointer" and runtimeFlavor.mono:
352+
pack_list.append(
353+
" success &= write_buffer_uintptr_t((uintptr_t)%s, &buffer, &offset, &size, &fixedBuffer);" %
354+
(parameter.name,))
343355
elif runtimeFlavor.mono:
344356
pack_list.append(
345357
" success &= write_buffer((const uint8_t *)%s, sizeof(%s), &buffer, &offset, &size, &fixedBuffer);" %
@@ -669,16 +681,17 @@ def generateEventPipeHelperFile(etwmanifest, eventpipe_directory, target_cpp, ru
669681

670682
for providerNode in tree.getElementsByTagName('provider'):
671683
providerName = providerNode.getAttribute('name')
672-
providerPrettyName = providerName.replace("Windows-", '')
673-
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
674-
providerPrettyName = providerPrettyName.replace('-', '_')
675-
if extern: helper.write(
676-
'extern "C" '
677-
)
678-
helper.write(
679-
"void Init" +
680-
providerPrettyName +
681-
"(void);\n\n")
684+
if includeProvider(providerName, runtimeFlavor):
685+
providerPrettyName = providerName.replace("Windows-", '')
686+
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
687+
providerPrettyName = providerPrettyName.replace('-', '_')
688+
if extern: helper.write(
689+
'extern "C" '
690+
)
691+
helper.write(
692+
"void Init" +
693+
providerPrettyName +
694+
"(void);\n\n")
682695

683696
if extern: helper.write(
684697
'extern "C" '
@@ -687,10 +700,11 @@ def generateEventPipeHelperFile(etwmanifest, eventpipe_directory, target_cpp, ru
687700
helper.write("void InitProvidersAndEvents(void)\n{\n")
688701
for providerNode in tree.getElementsByTagName('provider'):
689702
providerName = providerNode.getAttribute('name')
690-
providerPrettyName = providerName.replace("Windows-", '')
691-
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
692-
providerPrettyName = providerPrettyName.replace('-', '_')
693-
helper.write(" Init" + providerPrettyName + "();\n")
703+
if includeProvider(providerName, runtimeFlavor):
704+
providerPrettyName = providerName.replace("Windows-", '')
705+
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
706+
providerPrettyName = providerPrettyName.replace('-', '_')
707+
helper.write(" Init" + providerPrettyName + "();\n")
694708
helper.write("}\n")
695709

696710
if runtimeFlavor.coreclr:
@@ -892,6 +906,19 @@ def getMonoEventPipeImplFilePrefix():
892906
return write_buffer_int32_t (value, buffer, offset, size, fixed_buffer);
893907
}
894908
909+
static
910+
inline
911+
bool
912+
write_buffer_uintptr_t (
913+
uintptr_t value,
914+
uint8_t **buffer,
915+
size_t *offset,
916+
size_t *size,
917+
bool *fixed_buffer)
918+
{
919+
return write_buffer ((const uint8_t *)&value, sizeof (uintptr_t), buffer, offset, size, fixed_buffer);
920+
}
921+
895922
static
896923
inline
897924
EventPipeEvent *
@@ -949,6 +976,8 @@ def generateEventPipeImplFiles(
949976

950977
for providerNode in tree.getElementsByTagName('provider'):
951978
providerName = providerNode.getAttribute('name')
979+
if not includeProvider(providerName, runtimeFlavor):
980+
continue
952981

953982
providerPrettyName = providerName.replace("Windows-", '')
954983
providerPrettyName = providerPrettyName.replace("Microsoft-", '')

0 commit comments

Comments
 (0)