5
5
using System . Diagnostics ;
6
6
using System . Diagnostics . Tracing ;
7
7
using System . IO . Enumeration ;
8
+ using System . Net . Sockets ;
8
9
using ByteSizeLib ;
9
10
using Microsoft . Diagnostics . NETCore . Client ;
10
11
using Microsoft . Diagnostics . Tracing ;
@@ -117,7 +118,7 @@ private static void SetupUltraSampler(ProcessStartInfo startInfo)
117
118
value = ultraSamplerPath ;
118
119
}
119
120
120
- Console . WriteLine ( $ "DYLD_INSERT_LIBRARIES={ value } ") ;
121
+ // Console.WriteLine($"DYLD_INSERT_LIBRARIES={value}");
121
122
startInfo . Environment [ key ] = value ;
122
123
}
123
124
@@ -156,6 +157,7 @@ private UltraSamplerProfilerState(UltraProfilerOptions options, DiagnosticsClien
156
157
public static async Task < UltraSamplerProfilerState > Connect ( string baseName , int pid , CancellationToken token , UltraProfilerOptions options )
157
158
{
158
159
160
+ //var ultraTempFolder = Path.Combine(Path.GetTempPath(), ".ultra");
159
161
var ultraTempFolder = Path . Combine ( Path . GetTempPath ( ) , ".ultra" ) ;
160
162
161
163
var pattern = $ "dotnet-diagnostic-{ pid } -*";
@@ -189,15 +191,16 @@ public static async Task<UltraSamplerProfilerState> Connect(string baseName, int
189
191
}
190
192
191
193
var diagnosticClientMain = new DiagnosticsClient ( pid ) ;
192
- var diagnosticClientUltra = await DiagnosticsClientConnector . FromDiagnosticPort ( ultraDiagnosticPortSocket , token ) ;
194
+ //DiagnosticsClient? diagnosticClientMain = null;
195
+ var diagnosticClientUltra = ( await DiagnosticsClientConnector . FromDiagnosticPort ( ultraDiagnosticPortSocket , token ) . ConfigureAwait ( false ) ) ! . Instance ;
193
196
194
197
var timeoutSource = new CancellationTokenSource ( ) ;
195
198
var linkedCancellationTokenSource = CancellationTokenSource . CreateLinkedTokenSource ( token , timeoutSource . Token ) ;
196
199
197
200
try
198
201
{
199
202
timeoutSource . CancelAfter ( 1000 ) ;
200
- await diagnosticClientUltra ! . Instance . WaitForConnectionAsync ( linkedCancellationTokenSource . Token ) . ConfigureAwait ( false ) ;
203
+ await diagnosticClientUltra ! . WaitForConnectionAsync ( linkedCancellationTokenSource . Token ) . ConfigureAwait ( false ) ;
201
204
await diagnosticClientMain . WaitForConnectionAsync ( linkedCancellationTokenSource . Token ) . ConfigureAwait ( false ) ;
202
205
}
203
206
catch ( OperationCanceledException ) when ( timeoutSource . IsCancellationRequested )
@@ -209,7 +212,7 @@ public static async Task<UltraSamplerProfilerState> Connect(string baseName, int
209
212
throw ;
210
213
}
211
214
212
- return new UltraSamplerProfilerState ( options , diagnosticClientMain , diagnosticClientUltra . Instance , baseName , pid , token ) ;
215
+ return new UltraSamplerProfilerState ( options , diagnosticClientMain , diagnosticClientUltra , baseName , pid , token ) ;
213
216
}
214
217
215
218
public long TotalFileLength ( )
@@ -228,7 +231,8 @@ public long TotalFileLength()
228
231
public async Task StartProfiling ( )
229
232
{
230
233
var ultraEventProvider = new EventPipeProvider ( UltraSamplerParser . Name , EventLevel . Verbose ) ;
231
- _ultraSession = await _ultraDiagnosticsClient . StartEventPipeSessionAsync ( [ ultraEventProvider ] , true , 256 , _token ) . ConfigureAwait ( false ) ;
234
+ var config = new EventPipeSessionConfiguration ( [ ultraEventProvider ] , 256 , false , true ) ;
235
+ _ultraSession = await _ultraDiagnosticsClient . StartEventPipeSessionAsync ( config , _token ) . ConfigureAwait ( false ) ;
232
236
_ultraEventStreamCopyTask = _ultraSession . EventStream . CopyToAsync ( _ultraNetTraceFileStream , _token ) ;
233
237
234
238
if ( _mainDiagnosticsClient is not null )
@@ -264,14 +268,44 @@ public async Task Stop()
264
268
await _mainEventStreamCopyTask . ConfigureAwait ( false ) ;
265
269
}
266
270
267
- if ( _ultraSession is not null )
271
+ await SafeStopAsync ( _ultraSession , _token ) ;
272
+ _ultraSession = null ;
273
+
274
+ await SafeStopAsync ( _mainSession , _token ) ;
275
+ _mainSession = null ;
276
+ }
277
+
278
+ private static async Task SafeStopAsync ( EventPipeSession ? session , CancellationToken token )
279
+ {
280
+ if ( session is null ) return ;
281
+
282
+ try
268
283
{
269
- await _ultraSession . StopAsync ( _token ) . ConfigureAwait ( false ) ;
284
+ await session . StopAsync ( token ) . ConfigureAwait ( false ) ;
270
285
}
286
+ catch ( EndOfStreamException )
287
+ {
271
288
272
- if ( _mainSession is not null )
289
+ }
290
+ catch ( TimeoutException )
291
+ {
292
+
293
+ }
294
+ catch ( OperationCanceledException )
273
295
{
274
- await _mainSession . StopAsync ( _token ) . ConfigureAwait ( false ) ;
296
+
297
+ }
298
+ catch ( PlatformNotSupportedException )
299
+ {
300
+
301
+ }
302
+ catch ( ServerNotAvailableException )
303
+ {
304
+
305
+ }
306
+ catch ( SocketException )
307
+ {
308
+
275
309
}
276
310
}
277
311
0 commit comments