1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 using System.Runtime.CompilerServices;
7 using System.Runtime.InteropServices;
9 namespace Mono.Profiler.Log {
11 public static class LogProfiler {
13 static bool? _attached;
15 public static bool IsAttached {
17 if (_attached != null)
18 return (bool) _attached;
21 GetMaxStackTraceFrames ();
22 return (bool) (_attached = true);
23 } catch (MissingMethodException) {
24 return (bool) (_attached = false);
29 [MethodImpl (MethodImplOptions.InternalCall)]
30 extern static int GetMaxStackTraceFrames ();
32 public static int MaxStackTraceFrames {
33 get { return GetMaxStackTraceFrames (); }
36 [MethodImpl (MethodImplOptions.InternalCall)]
37 extern static int GetStackTraceFrames ();
39 [MethodImpl (MethodImplOptions.InternalCall)]
40 extern static void SetStackTraceFrames (int value);
42 public static int StackTraceFrames {
43 get { return GetStackTraceFrames (); }
45 var max = MaxStackTraceFrames;
47 if (value < 0 || value > max)
48 throw new ArgumentOutOfRangeException (nameof (value), value, $"Value must be between 0 and {max}.");
50 SetStackTraceFrames (value);
54 [MethodImpl (MethodImplOptions.InternalCall)]
55 extern static LogHeapshotMode GetHeapshotMode ();
57 [MethodImpl (MethodImplOptions.InternalCall)]
58 extern static void SetHeapshotMode (LogHeapshotMode value);
60 public static LogHeapshotMode HeapshotMode {
61 get { return GetHeapshotMode (); }
63 if (!Enum.IsDefined (typeof (LogHeapshotMode), value))
64 throw new ArgumentException ("Invalid heapshot mode.", nameof (value));
66 SetHeapshotMode (value);
70 [MethodImpl (MethodImplOptions.InternalCall)]
71 extern static int GetHeapshotMillisecondsFrequency ();
73 [MethodImpl (MethodImplOptions.InternalCall)]
74 extern static void SetHeapshotMillisecondsFrequency (int value);
76 public static int HeapshotMillisecondsFrequency {
77 get { return GetHeapshotMillisecondsFrequency (); }
80 throw new ArgumentOutOfRangeException (nameof (value), value, "Value must be non-negative.");
82 SetHeapshotMillisecondsFrequency (value);
86 [MethodImpl (MethodImplOptions.InternalCall)]
87 extern static int GetHeapshotCollectionsFrequency ();
89 [MethodImpl (MethodImplOptions.InternalCall)]
90 extern static void SetHeapshotCollectionsFrequency (int value);
92 public static int HeapshotCollectionsFrequency {
93 get { return GetHeapshotCollectionsFrequency (); }
96 throw new ArgumentOutOfRangeException (nameof (value), value, "Value must be non-negative.");
98 SetHeapshotCollectionsFrequency (value);
102 [MethodImpl (MethodImplOptions.InternalCall)]
103 extern static int GetCallDepth ();
105 [MethodImpl (MethodImplOptions.InternalCall)]
106 extern static void SetCallDepth (int value);
108 public static int CallDepth {
109 get { return GetCallDepth (); }
112 throw new ArgumentOutOfRangeException (nameof (value), value, "Value must be non-negative.");
114 SetCallDepth (value);
118 [MethodImpl (MethodImplOptions.InternalCall)]
119 extern static void GetSampleMode (out LogSampleMode mode, out int frequency);
121 [MethodImpl (MethodImplOptions.InternalCall)]
122 extern static bool SetSampleMode (LogSampleMode value, int frequency);
124 public static LogSampleMode SampleMode {
126 GetSampleMode (out var mode, out var _);
132 public static int SampleFrequency {
134 GetSampleMode (out var _, out var frequency);
140 public static bool SetSampleParameters (LogSampleMode mode, int frequency)
142 if (!Enum.IsDefined (typeof (LogSampleMode), mode))
143 throw new ArgumentException ("Invalid sample mode.", nameof (mode));
146 throw new ArgumentOutOfRangeException (nameof (frequency), frequency, "Frequency must be positive.");
148 return SetSampleMode (mode, frequency);
151 [MethodImpl (MethodImplOptions.InternalCall)]
152 extern static bool GetExceptionEvents ();
154 [MethodImpl (MethodImplOptions.InternalCall)]
155 extern static void SetExceptionEvents (bool value);
157 public static bool ExceptionEventsEnabled {
158 get { return GetExceptionEvents (); }
159 set { SetExceptionEvents (value); }
162 [MethodImpl (MethodImplOptions.InternalCall)]
163 extern static bool GetMonitorEvents ();
165 [MethodImpl (MethodImplOptions.InternalCall)]
166 extern static void SetMonitorEvents (bool value);
168 public static bool MonitorEventsEnabled {
169 get { return GetMonitorEvents (); }
170 set { SetMonitorEvents (value); }
173 [MethodImpl (MethodImplOptions.InternalCall)]
174 extern static bool GetGCEvents ();
176 [MethodImpl (MethodImplOptions.InternalCall)]
177 extern static void SetGCEvents (bool value);
179 public static bool GCEventsEnabled {
180 get { return GetGCEvents (); }
181 set { SetGCEvents (value); }
184 [MethodImpl (MethodImplOptions.InternalCall)]
185 extern static bool GetGCAllocationEvents ();
187 [MethodImpl (MethodImplOptions.InternalCall)]
188 extern static void SetGCAllocationEvents (bool value);
190 public static bool GCAllocationEventsEnabled {
191 get { return GetGCAllocationEvents (); }
192 set { SetGCAllocationEvents (value); }
195 [MethodImpl (MethodImplOptions.InternalCall)]
196 extern static bool GetGCMoveEvents ();
198 [MethodImpl (MethodImplOptions.InternalCall)]
199 extern static void SetGCMoveEvents (bool value);
201 public static bool GCMoveEventsEnabled {
202 get { return GetGCMoveEvents (); }
203 set { SetGCMoveEvents (value); }
206 [MethodImpl (MethodImplOptions.InternalCall)]
207 extern static bool GetGCRootEvents ();
209 [MethodImpl (MethodImplOptions.InternalCall)]
210 extern static void SetGCRootEvents (bool value);
212 public static bool GCRootEventsEnabled {
213 get { return GetGCRootEvents (); }
214 set { SetGCRootEvents (value); }
217 [MethodImpl (MethodImplOptions.InternalCall)]
218 extern static bool GetGCHandleEvents ();
220 [MethodImpl (MethodImplOptions.InternalCall)]
221 extern static void SetGCHandleEvents (bool value);
223 public static bool GCHandleEventsEnabled {
224 get { return GetGCHandleEvents (); }
225 set { SetGCHandleEvents (value); }
228 [MethodImpl (MethodImplOptions.InternalCall)]
229 extern static bool GetGCFinalizationEvents ();
231 [MethodImpl (MethodImplOptions.InternalCall)]
232 extern static void SetGCFinalizationEvents (bool value);
234 public static bool GCFinalizationEventsEnabled {
235 get { return GetGCFinalizationEvents (); }
236 set { SetGCFinalizationEvents (value); }
239 [MethodImpl (MethodImplOptions.InternalCall)]
240 extern static bool GetCounterEvents ();
242 [MethodImpl (MethodImplOptions.InternalCall)]
243 extern static void SetCounterEvents (bool value);
245 public static bool CounterEventsEnabled {
246 get { return GetCounterEvents (); }
247 set { SetCounterEvents (value); }
250 [MethodImpl (MethodImplOptions.InternalCall)]
251 extern static bool GetJitEvents ();
253 [MethodImpl (MethodImplOptions.InternalCall)]
254 extern static void SetJitEvents (bool value);
256 public static bool JitEventsEnabled {
257 get { return GetJitEvents (); }
258 set { SetJitEvents (value); }