1212using Microsoft . Diagnostics . Tracing . Parsers ;
1313using Microsoft . Diagnostics . Tracing . Parsers . Kernel ;
1414using Microsoft . Diagnostics . Tracing . Session ;
15+ using System . Xml . Linq ;
1516
1617namespace BenchmarkDotNet . Diagnostics . Windows
1718{
@@ -123,65 +124,72 @@ private string CreateCvTraceFile(DiagnoserActionParameters parameters)
123124 var cvPathFile = Path . ChangeExtension ( traceFilePath , ".CvTrace" ) ;
124125 var traceFileName = Path . GetFileName ( traceFilePath ) ;
125126
126- File . WriteAllText ( cvPathFile ,
127- $@ "<?xml version=""1.0""?>
128- <ConcurrencyTrace xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" MajorVersion=""1"" MinorVersion=""0"">
129- <Config MajorVersion=""1"" MinorVersion=""0"">
130- <DeleteEtlsAfterAnalysis>false</DeleteEtlsAfterAnalysis>
131- <TraceLocation>{ directoryPath } </TraceLocation>
132- <Markers>
133- <MarkerProvider Name=""ConcurrencyVisualizer.Markers"" Guid=""{ ConcurrencyVisualizerMarkersId } "" Level=""Low"" />
134- <MarkerProvider Name=""System.Threading.Tasks"" Guid=""{ TplEtwProviderTraceEventParser . ProviderGuid } "" Level=""Normal"" />
135- <MarkerProvider Name=""System.Threading.Tasks.Dataflow"" Guid=""{ TplDataflowId } "" Level=""Normal"" />
136- <MarkerProvider Name=""System.Threading"" Guid=""{ TplSynchronizationId } "" Level=""Normal"" />
137- <MarkerProvider Name=""System.Collections.Concurrent"" Guid=""{ ManagedConcurrentCollectionsId } "" Level=""Normal"" />
138- <MarkerProvider Name=""System.Linq.Parallel"" Guid=""{ PlinqId } "" Level=""Normal"" />
139- </Markers>
140- <FilterConfig>
141- <CollectClrEvents>true</CollectClrEvents>
142- <ClrCollectionOptions>None</ClrCollectionOptions>
143- <CollectSampleEvents>true</CollectSampleEvents>
144- <CollectGpuEvents>false</CollectGpuEvents>
145- <CollectFileIO>true</CollectFileIO>
146- </FilterConfig>
147- <UserBufferSettings>
148- <BufferFlushTimer>0</BufferFlushTimer>
149- <BufferSize>256</BufferSize>
150- <MinimumBuffers>512</MinimumBuffers>
151- <MaximumBuffers>1024</MaximumBuffers>
152- </UserBufferSettings>
153- <KernelBufferSettings>
154- <BufferFlushTimer>0</BufferFlushTimer>
155- <BufferSize>256</BufferSize>
156- <MinimumBuffers>512</MinimumBuffers>
157- <MaximumBuffers>1024</MaximumBuffers>
158- </KernelBufferSettings>
159- { GenerateCodeInfo ( parameters ) }
160- </Config>
161- <Pid>{ processId } </Pid>
162- <EtwSourceFileNames>
163- <EtwSourceFile>{ traceFileName } </EtwSourceFile>
164- </EtwSourceFileNames>
165- <TraceProcesses />
166- <NtToDosMaps>
167- <NtToDosNameMap NtName=""\??\"" DosName="""" />
168- <NtToDosNameMap NtName=""\SystemRoot\"" DosName=""C:\WINDOWS\"" />
169- <NtToDosNameMap NtName=""\Windows\"" DosName=""C:\WINDOWS\"" />
170- </NtToDosMaps>
171- </ConcurrencyTrace>
172- " ) ;
127+ var trace = new XElement ( "ConcurrencyTrace" ,
128+ new XAttribute ( XNamespace . Xmlns + "xsi" , "http://www.w3.org/2001/XMLSchema-instance" ) ,
129+ new XAttribute ( XNamespace . Xmlns + "xsd" , "http://www.w3.org/2001/XMLSchema" ) ,
130+ new XAttribute ( "MajorVersion" , "1" ) ,
131+ new XAttribute ( "MinorVersion" , "0" ) ,
132+ new XElement ( "Config" ,
133+ new XAttribute ( "MajorVersion" , "1" ) ,
134+ new XAttribute ( "MinorVersion" , "0" ) ,
135+ new XElement ( "DeleteEtlsAfterAnalysis" , "false" ) ,
136+ new XElement ( "TraceLocation" , directoryPath ) ,
137+ new XElement ( "Markers" ,
138+ MarkerProvider ( "ConcurrencyVisualizer.Markers" , ConcurrencyVisualizerMarkersId , "Low" ) ,
139+ MarkerProvider ( "System.Threading.Tasks" , TplEtwProviderTraceEventParser . ProviderGuid , "Normal" ) ,
140+ MarkerProvider ( "System.Threading.Tasks.Dataflow" , TplDataflowId , "Normal" ) ,
141+ MarkerProvider ( "System.Threading" , TplSynchronizationId , "Normal" ) ,
142+ MarkerProvider ( "System.Collections.Concurrent" , ManagedConcurrentCollectionsId , "Normal" ) ,
143+ MarkerProvider ( "System.Linq.Parallel" , PlinqId , "Normal" ) ) ,
144+ new XElement ( "FilterConfig" ,
145+ new XElement ( "CollectClrEvents" , "true" ) ,
146+ new XElement ( "ClrCollectionOptions" , "None" ) ,
147+ new XElement ( "CollectSampleEvents" , "true" ) ,
148+ new XElement ( "CollectGpuEvents" , "false" ) ,
149+ new XElement ( "CollectFileIO" , "true" ) ) ,
150+ BufferSettings ( "UserBufferSettings" ) ,
151+ BufferSettings ( "KernelBufferSettings" ) ,
152+ GenerateCodeInfo ( parameters ) ) ,
153+ new XElement ( "Pid" , processId ) ,
154+ new XElement ( "EtwSourceFileNames" ,
155+ new XElement ( "EtwSourceFile" , traceFileName ) ) ,
156+ new XElement ( "TraceProcesses" ) ,
157+ new XElement ( "NtToDosMaps" ,
158+ NtToDosNameMap ( @"\??\" , "" ) ,
159+ NtToDosNameMap ( @"\SystemRoot\" , @"C:\WINDOWS\" ) ,
160+ NtToDosNameMap ( @"\Windows\" , @"C:\WINDOWS\" ) ) ) ;
161+
162+ new XDocument ( new XDeclaration ( "1.0" , null , null ) , trace ) . Save ( cvPathFile ) ;
173163
174164 return cvPathFile ;
175165 }
176166
177- private string GenerateCodeInfo ( DiagnoserActionParameters parameters )
167+ private static XElement MarkerProvider ( string name , Guid id , string level )
168+ => new ( "MarkerProvider" ,
169+ new XAttribute ( "Name" , name ) ,
170+ new XAttribute ( "Guid" , id ) ,
171+ new XAttribute ( "Level" , level ) ) ;
172+
173+ private static XElement BufferSettings ( string name )
174+ => new ( name ,
175+ new XElement ( "BufferFlushTimer" , "0" ) ,
176+ new XElement ( "BufferSize" , "256" ) ,
177+ new XElement ( "MinimumBuffers" , "512" ) ,
178+ new XElement ( "MaximumBuffers" , "1024" ) ) ;
179+
180+ private static XElement NtToDosNameMap ( string ntName , string dosName )
181+ => new ( "NtToDosNameMap" ,
182+ new XAttribute ( "NtName" , ntName ) ,
183+ new XAttribute ( "DosName" , dosName ) ) ;
184+
185+ private XElement GenerateCodeInfo ( DiagnoserActionParameters parameters )
178186 {
179187 if ( ! parameters . Config . Options . IsSet ( ConfigOptions . KeepBenchmarkFiles ) )
180- return "< JustMyCode />" ;
188+ return new XElement ( " JustMyCode" ) ;
181189
182190 var folderWithDlls = Path . GetDirectoryName ( parameters . BenchmarkCase . Descriptor . Type . Assembly . Location ) ;
183191
184- return $ "< JustMyCode>< MyCodeDirectory> { folderWithDlls } </MyCodeDirectory></JustMyCode>" ;
192+ return new XElement ( " JustMyCode" , new XElement ( " MyCodeDirectory" , folderWithDlls ) ) ;
185193 }
186194 }
187195}
0 commit comments