private void MergeFiles(string kernelTraceFile, string userTraceFile, string traceFile) { var files = new List <string>(); if (!File.Exists(kernelTraceFile)) { Console.WriteLine("Kernel trace file not found."); Environment.Exit(1); } files.Add(kernelTraceFile); if (File.Exists(userTraceFile)) { files.Add(userTraceFile); } logger.Log($"Merging {string.Join(',', files)}... "); try { TraceEventSession.Merge(files.ToArray(), traceFile); } catch (System.Runtime.InteropServices.COMException) { Console.WriteLine("Unable to merge the trace files due to insufficient system resources. Try freeing some memory."); Environment.Exit(1); } if (File.Exists(traceFile)) { File.Delete(userTraceFile); File.Delete(kernelTraceFile); } }
public Func <Dictionary <string, ETWHelper.CallTreeItem> > StopAndLazyMerge(bool leaveTraces) { bool rundown = !this.process.WaitForExit(500); StopCollection(collectionHandle, rundown: rundown); var pid = process.Id; return(() => { var tmpFile = outFile + ".merged.etl"; if (File.Exists(tmpFile)) { File.Delete(tmpFile); } var allFiles = GetAllResultFiles(outFile); if (allFiles.Length > 1) { TraceEventSession.Merge(allFiles, tmpFile, TraceEventMergeOptions.Compress); File.Delete(outFile); File.Move(tmpFile, outFile); } else if (allFiles[0] != outFile) { File.Move(allFiles[0], outFile); } var(etlx, callTree) = TryGetCallTree(pid); if (!leaveTraces) { if (File.Exists(etlx)) { File.Delete(etlx); } File.Delete(outFile); foreach (var f in Directory.GetFiles(Path.GetDirectoryName(outFile))) { if (Path.GetFileName(f).StartsWith(Path.GetFileNameWithoutExtension(outFile))) { File.Delete(f); } } } else if (rundown) { Directory.CreateDirectory(Path.Combine(Path.GetDirectoryName(outFile), "symbols")); MergeAndZip(outFile); } else { Zip(outFile); } return callTree; }); }
private void MergeFiles(string kernelTraceFile, string userTraceFile, string traceFile) { var files = new List <string>(); if (!File.Exists(kernelTraceFile)) { throw new FileNotFoundException("Kernel trace file not found."); } files.Add(kernelTraceFile); if (File.Exists(userTraceFile)) { files.Add(userTraceFile); } logger.Log($"Merging {string.Join(',',files)}... "); TraceEventSession.Merge(files.ToArray(), traceFile); if (File.Exists(traceFile)) { File.Delete(userTraceFile); File.Delete(kernelTraceFile); } }
public static void Stop(string sessionName) { Sessions sessions; if (s_sessions.TryRemove(sessionName, out sessions)) { sessions.Close(); var files = sessions.KernelFileName == sessions.UserFileName ? new[] { sessions.KernelFileName } : new[] { sessions.KernelFileName, sessions.UserFileName }; TraceEventSession.Merge(files, sessions.MergedFileName, TraceEventMergeOptions.Compress); if (File.Exists(sessions.UserFileName)) { File.Delete(sessions.UserFileName); } if (File.Exists(sessions.KernelFileName)) { File.Delete(sessions.KernelFileName); } } }
private List <string> PrepForWrite() { // If the user did not specify a place to put log messages, make one for them. if (Log == null) { Log = new StringWriter(); } Stopwatch sw = Stopwatch.StartNew(); // Compute input & temp files. var dir = Path.GetDirectoryName(m_etlFilePath); if (dir.Length == 0) { dir = "."; } var baseName = Path.GetFileNameWithoutExtension(m_etlFilePath); List <string> mergeInputs = new List <string>(); mergeInputs.Add(m_etlFilePath); mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".kernel*.etl")); mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".clr*.etl")); mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".user*.etl")); string tempName = Path.ChangeExtension(m_etlFilePath, ".etl.new"); List <string> pdbFileList = null; try { // Do the merge and NGEN pdb lookup in parallel Task mergeWorker = Task.Factory.StartNew(delegate { if (Merge) { var startTime = DateTime.UtcNow; Log.WriteLine("Starting Merging of {0}", m_etlFilePath); TraceEventMergeOptions options = TraceEventMergeOptions.None; if (CompressETL) { options |= TraceEventMergeOptions.Compress; } // Do the merge TraceEventSession.Merge(mergeInputs.ToArray(), tempName, options); Log.WriteLine("Merging took {0:f1} sec", (DateTime.UtcNow - startTime).TotalSeconds); } else { Log.WriteLine("Merge == false, skipping Merge operation."); } }); Task pdbWorker = Task.Factory.StartNew(delegate { if (NGenSymbolFiles) { var startTime = DateTime.UtcNow; Log.WriteLine("Starting Generating NGEN pdbs for {0}", m_etlFilePath); var symbolReader = SymbolReader; if (symbolReader == null) { symbolReader = new SymbolReader(Log); } pdbFileList = GetNGenPdbs(m_etlFilePath, symbolReader, Log); Log.WriteLine("Generating NGEN Pdbs took {0:f1} sec", (DateTime.UtcNow - startTime).TotalSeconds); } else { Log.WriteLine("NGenSymbolFiles == false, skipping NGEN pdb generation"); } }); Task.WaitAll(mergeWorker, pdbWorker); if (File.Exists(tempName)) { // Delete/move the original files after the two worker threads finished execution to avoid races. foreach (var mergeInput in mergeInputs) { FileUtilities.ForceDelete(mergeInput); } Log.WriteLine("Moving {0} to {1}", tempName, m_etlFilePath); // Place the output in its final resting place. FileUtilities.ForceMove(tempName, m_etlFilePath); } } finally { Log.WriteLine("Deleting temp file"); if (File.Exists(tempName)) { File.Delete(tempName); } } sw.Stop(); Log.WriteLine("Merge took {0:f3} sec.", sw.Elapsed.TotalSeconds); Log.WriteLine("Merge output file {0}", m_etlFilePath); return(pdbFileList); }