diff --git a/eng/Versions.props b/eng/Versions.props index e7f330892e..285fecbc3c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 1.1.61812 1.7.0 - 2.0.44 + 2.0.51 3.1.2 3.1.2 3.1.2 diff --git a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs index 6b4d13451a..58017d5622 100644 --- a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs +++ b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs @@ -13,13 +13,14 @@ namespace Microsoft.Diagnostics.Tools.Trace { - internal enum TraceFileFormat { NetTrace, Speedscope }; + internal enum TraceFileFormat { NetTrace, Speedscope, Chromium }; internal static class TraceFileFormatConverter { - private static Dictionary TraceFileFormatExtensions = new Dictionary() { + private static IReadOnlyDictionary TraceFileFormatExtensions = new Dictionary() { { TraceFileFormat.NetTrace, "nettrace" }, - { TraceFileFormat.Speedscope, "speedscope.json" } + { TraceFileFormat.Speedscope, "speedscope.json" }, + { TraceFileFormat.Chromium, "chromium.json" } }; public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, string outputFilename = "") @@ -35,9 +36,10 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, case TraceFileFormat.NetTrace: break; case TraceFileFormat.Speedscope: + case TraceFileFormat.Chromium: try { - ConvertToSpeedscope(fileToConvert, outputFilename); + Convert(format, fileToConvert, outputFilename); } // TODO: On a broken/truncated trace, the exception we get from TraceEvent is a plain System.Exception type because it gets caught and rethrown inside TraceEvent. // We should probably modify TraceEvent to throw a better exception. @@ -46,7 +48,7 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, if (ex.ToString().Contains("Read past end of stream.")) { Console.WriteLine("Detected a potentially broken trace. Continuing with best-efforts to convert the trace, but resulting speedscope file may contain broken stacks as a result."); - ConvertToSpeedscope(fileToConvert, outputFilename, true); + Convert(format, fileToConvert, outputFilename, true); } else { @@ -61,10 +63,10 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, Console.Out.WriteLine("Conversion complete"); } - private static void ConvertToSpeedscope(string fileToConvert, string outputFilename, bool continueOnError=false) + private static void Convert(TraceFileFormat format, string fileToConvert, string outputFilename, bool continueOnError=false) { var etlxFilePath = TraceLog.CreateFromEventPipeDataFile(fileToConvert, null, new TraceLogOptions() { ContinueOnError = continueOnError } ); - using (var symbolReader = new SymbolReader(System.IO.TextWriter.Null) { SymbolPath = SymbolPath.MicrosoftSymbolServerPath }) + using (var symbolReader = new SymbolReader(TextWriter.Null) { SymbolPath = SymbolPath.MicrosoftSymbolServerPath }) using (var eventLog = new TraceLog(etlxFilePath)) { var stackSource = new MutableTraceEventStackSource(eventLog) @@ -78,14 +80,24 @@ private static void ConvertToSpeedscope(string fileToConvert, string outputFilen }; computer.GenerateThreadTimeStacks(stackSource); - SpeedScopeStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename); + switch (format) + { + case TraceFileFormat.Speedscope: + SpeedScopeStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename); + break; + case TraceFileFormat.Chromium: + ChromiumStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename, compress: false); + break; + default: + // we should never get here + throw new ArgumentException($"Invalid TraceFileFormat \"{format}\""); + } } if (File.Exists(etlxFilePath)) { File.Delete(etlxFilePath); } - } } }