[profiler] log profiler: limit method instrumentation to selected methods (#5517)
[mono.git] / mono / profiler / log.c
index 8a3790aac248ed44baa2d156137da838cfb65e42..8a677c2720d48bba530592351a5f6283d87f970b 100644 (file)
@@ -1142,7 +1142,7 @@ sync_point_mark (MonoProfilerSyncPointType type)
 
        ENTER_LOG (&sync_points_ctr, logbuffer,
                EVENT_SIZE /* event */ +
-               LEB128_SIZE /* type */
+               BYTE_SIZE /* type */
        );
 
        emit_event (logbuffer, TYPE_META | TYPE_SYNC_POINT);
@@ -1219,7 +1219,7 @@ gc_roots (MonoProfiler *prof, MonoObject *const *objects, const MonoProfilerGCRo
 
        for (int i = 0; i < num; ++i) {
                emit_obj (logbuffer, objects [i]);
-               emit_byte (logbuffer, root_types [i]);
+               emit_value (logbuffer, root_types [i]);
                emit_value (logbuffer, extra_info [i]);
        }
 
@@ -1816,6 +1816,10 @@ method_exc_leave (MonoProfiler *prof, MonoMethod *method, MonoObject *exc)
 static MonoProfilerCallInstrumentationFlags
 method_filter (MonoProfiler *prof, MonoMethod *method)
 {
+       if (log_config.callspec.len > 0 &&
+           !mono_callspec_eval (method, &log_config.callspec))
+               return MONO_PROFILER_CALL_INSTRUMENTATION_NONE;
+
        return MONO_PROFILER_CALL_INSTRUMENTATION_ENTER |
               MONO_PROFILER_CALL_INSTRUMENTATION_LEAVE |
               MONO_PROFILER_CALL_INSTRUMENTATION_TAIL_CALL |
@@ -1905,7 +1909,8 @@ clause_exc (MonoProfiler *prof, MonoMethod *method, uint32_t clause_num, MonoExc
                EVENT_SIZE /* event */ +
                BYTE_SIZE /* clause type */ +
                LEB128_SIZE /* clause num */ +
-               LEB128_SIZE /* method */
+               LEB128_SIZE /* method */ +
+               LEB128_SIZE /* exc */
        );
 
        emit_event (logbuffer, TYPE_EXCEPTION | TYPE_CLAUSE);
@@ -2268,7 +2273,7 @@ dump_ubin (const char *filename, uintptr_t load_addr, uint64_t offset, uintptr_t
                LEB128_SIZE /* load address */ +
                LEB128_SIZE /* offset */ +
                LEB128_SIZE /* size */ +
-               nlen /* file name */
+               len /* file name */
        );
 
        emit_event (logbuffer, TYPE_SAMPLE | TYPE_SAMPLE_UBIN);
@@ -2671,6 +2676,12 @@ counters_sample (uint64_t timestamp)
        ;
 
        for (agent = log_profiler.counters; agent; agent = agent->next) {
+               /*
+                * FIXME: This calculation is incorrect for string counters since
+                * mono_counter_get_size () just returns 0 in that case. We should
+                * address this if we ever actually add any string counters to Mono.
+                */
+
                size +=
                        LEB128_SIZE /* index */ +
                        BYTE_SIZE /* type */ +
@@ -4256,12 +4267,12 @@ proflog_icall_SetMonitorEvents (MonoBoolean value)
        mono_coop_mutex_lock (&log_profiler.api_mutex);
 
        if (value) {
-               ENABLE (PROFLOG_EXCEPTION_EVENTS);
+               ENABLE (PROFLOG_MONITOR_EVENTS);
                mono_profiler_set_monitor_contention_callback (log_profiler.handle, monitor_contention);
                mono_profiler_set_monitor_acquired_callback (log_profiler.handle, monitor_acquired);
                mono_profiler_set_monitor_failed_callback (log_profiler.handle, monitor_failed);
        } else {
-               DISABLE (PROFLOG_EXCEPTION_EVENTS);
+               DISABLE (PROFLOG_MONITOR_EVENTS);
                mono_profiler_set_monitor_contention_callback (log_profiler.handle, NULL);
                mono_profiler_set_monitor_acquired_callback (log_profiler.handle, NULL);
                mono_profiler_set_monitor_failed_callback (log_profiler.handle, NULL);